Precisione implicita delle funzioni in virgola mobile

10

Durante la revisione della implementazione di una funzione per calcolare la normale CDF di distribuzione di un altro programmatore, ho eseguito un suggerimento per sostituire l'intera implementazione con le funzioni built-in di Python o utilizzare SciPy, una libreria scientifica comune.

Un altro programmatore ha sottolineato che né math.erfc() scipy.stats.norm.cdf() fornisce garanzie di precisione nella loro documentazione. Pertanto, dovrei essere più cauto nel sostituire un algoritmo di approssimazione (che è stato preso da una fonte rispettata , e che aveva limiti di errore documentati ).

Per essere onesti, il pensiero di dubitare dell'accuratezza e della precisione di una funzione incorporata o di una biblioteca non mi era mai passato per la testa. Dopotutto, ho chiamato funzioni come sin() e sqrt() per anni senza pensarci troppo: perché math.erf() o scipy.stats.norm.cdf() possono essere diversi?

Ma ora, sono preoccupato. Le mie domande sono:

  1. In generale, se la documentazione non fa menzione speciale, è implicito che questo tipo di funzioni sono completamente accurate all'ultimo decimale, nella precisione offerta dal punto di virgola mobile a precisione doppia IEEE?
  2. È vero per il math.erf() di Python o il scipy.stats.norm.cdf() di SciPy in particolare? Come puoi dire?
  3. Questa pagina man per sin() dice ...

    These functions may lose accuracy when their argument is near a multiple of pi or is far from 0.0.

    Perché questi caveat esistono, quando la funzione seno è periodica e simmetrica? Sembra esserci un onere a carico del chiamante per canonicalizzare l'input per ottenere una precisione ottimale.

    D'altra parte, la documentazione di Mozilla per Math.sin() non dice nulla sull'accuratezza o la precisione. Significa che è completamente preciso, o è "conoscenza comune" che Math.sin() sarebbe accurato solo in determinate circostanze in JavaScript, come ovunque?

posta 200_success 08.08.2014 - 21:04
fonte

1 risposta

11

If the documentation makes no special mention, is it implied that these kinds of functions are completely accurate to the last decimal place, within the precision offered by IEEE double-precision floating-point?

Non vorrei fare quella supposizione.

Dove lavoro ci occupiamo di dati di telemetria, ed è risaputo che due diverse librerie matematiche possono produrre due risultati diversi, anche se entrambi sono conformi agli standard in virgola mobile IEEE. Ciò ha implicazioni quando stai cercando di ripetere un calcolo e confrontare due risultati per l'uguaglianza.

There seems to be a burden placed on the caller to canonicalize the input to obtain optimal accuracy.

Questa è una valutazione equa. Ciò che lo rende accettabile è che la documentazione afferma che, in modo che non ci siano sorprese.

On the other hand, Mozilla's documentation ...

Suggerisco di provare alcuni calcoli in ogni libreria o linguaggio di programmazione (specialmente vicino alle aree di confine come sin() vicino a un multiplo di pi ) e confrontarli. Questo dovrebbe darti un'idea precisa del tipo di comportamento che puoi aspettarti da ciascuno di essi.

    
risposta data 08.08.2014 - 21:18
fonte

Leggi altre domande sui tag