Precisione implicita delle funzioni in virgola mobile


9

Durante la revisione dell'implementazione di un'altra funzione di un programmatore per calcolare il normale CDF di distribuzione , ho suggerito di sostituire l'intera implementazione con le funzioni integrate di Python o di utilizzare SciPy, una libreria scientifica comune.

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

Ad essere sincero, il pensiero di dubitare dell'accuratezza e della precisione di una funzione di libreria o incorporata non mi è mai passato per la testa. Dopotutto, ho chiamato funzioni come sin()e sqrt()per anni senza pensarci troppo - perché dovrebbe math.erf()o scipy.stats.norm.cdf()essere diverso?

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 fino all'ultimo decimale, con la precisione offerta da IEEE a virgola mobile a precisione doppia?
  2. È vero in particolare per Python math.erf()o SciPy scipy.stats.norm.cdf()? Come puoi dirlo?
  3. Questa pagina man persin() dice ...

    Queste funzioni possono perdere accuratezza quando il loro argomento è vicino a un multiplo di pi o è lontano da 0,0.

    Perché dovrebbero esistere simili avvertenze, quando la funzione seno è periodica e simmetrica? Sembra che ci sia un onere posto sul 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 sulla precisione. Ciò significa che è completamente accurato, o è "conoscenza comune" che Math.sin()sarebbe accurato solo in determinate circostanze in JavaScript, come ovunque?


1
A proposito della domanda 1: di solito vengono fornite garanzie di precisione in termini di ULP (unità all'ultimo posto) che si riferisce alle cifre binarie del galleggiante.

Risposte:


10

Se la documentazione non fa menzione speciale, è implicito che questo tipo di funzioni sono completamente accurate fino all'ultimo decimale, con la precisione offerta da IEEE a virgola mobile a precisione doppia?

Non farei questo presupposto.

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

Sembra che ci sia un onere posto sul chiamante per canonicalizzare l'input per ottenere una precisione ottimale.

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

D'altra parte, la documentazione di Mozilla ...

Ti 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 una buona idea di quale tipo di comportamento puoi aspettarti da ognuno.


2
Il test è una buona idea. Ci sono innumerevoli volte in cui la documentazione dice una cosa, ma le funzioni si comportano in un altro modo. E OP vuole fare affidamento su ipotesi implicite che non sono nemmeno documentate.
Siyuan Ren,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.