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