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()
né 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:
- 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?
- È vero in particolare per Python
math.erf()
o SciPyscipy.stats.norm.cdf()
? Come puoi dirlo? Questa pagina man per
sin()
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" cheMath.sin()
sarebbe accurato solo in determinate circostanze in JavaScript, come ovunque?