Perché è importante la precisione del modulo in virgola mobile?


9

La maggior parte dei dialetti Smalltalk attualmente implementa un modulo fluttuante inesatto ingenuo (fmod / resto).
Ho appena cambiato questo per migliorare Squeak / Pharo e infine altre aderenze Smalltalk agli standard (IEEE 754, ISO / IEC 10967), come ho già fatto per altre operazioni all'avanguardia in virgola mobile.

Tuttavia, per l'adozione di tali cambiamenti, prevedo che aderire allo standard non sarà sufficiente per convincere i miei colleghi, quindi spiegare in quali circostanze questa esattezza avrebbe davvero importanza mi aiuterebbe molto. Finora non sono riuscito a trovare un buon esempio da solo.

Qualcuno qui sa perché / quando / dove (IOW in quale algoritmo) tale esattezza del modulo avrebbe importanza?


Io penso che si potrebbe ottenere risposte migliori su Computational Science in quanto tali questioni sono più importanti nella loro (sotto) dominio. In ogni caso, la domanda è ontopica qui e dovresti dare ai nostri rispondenti qualche giorno prima di ripubblicare.
Raffaello

1
Ho visto il codice basarsi sull'esattezza di fmod / modf che mi ha fatto rabbrividire, ma la possibilità che un linguaggio possa osare implementare un modulo in virgola mobile inesatto ingenuo sembra ancora più spaventosa. Codice di esempio: (1) Prendi il resto. (2) Stop se è zero. (3) Moltiplicalo per 2 e vai a (1). Si può fare un lavoro utile durante questo processo, ma il punto cruciale è che la fine di questo processo si basa sull'esattezza del resto e sull'esattezza della moltiplicazione per 2. Non sono sicuro se dovrei dare una risposta più completa qui, perché la scienza computazionale sembra più appropriata per questa domanda.
Thomas Klimpel,

Un'ipotesi: normalizzare l'ingresso di una funzione trigonometrica.
Paul A. Clayton,

@ThomasKlimpel Sono interessato se trovi riferimenti. Nota che il resto ingenuo è definito come (x - ((y / x) troncato * x)) con IEEE arrotondato alle operazioni pari più vicine, possiamo dimostrare che esattaRem (x, y) == 0 => naiveRem (x, y) == 0. Il problema è il contrario - falsa divisione esatta positiva - come naiveRem (4.0,0.1) == 0.0 che sfortunatamente soddisfa aspettative ingenue in molti casi!
aka.nice

@ PaulA.Clayton sì, per il seno in gradi forse ... Anche se, la mia ipotesi è che l'ingenuo rem funziona altrettanto bene di quello esatto fino a ca. 1e16 gradi perché 360 ha solo un intervallo di 6 bit impostato e poiché la divisione per 360 sembra non arrotondare mai per i predecessori di multipli di 360 ... Per i radianti una libreria decente richiede una precisione multipla, fa un rem esatto limitato alla doppia precisione davvero di aiuto in tal caso?
aka.nice

Risposte:


1

Si noti che l'implementazione inesatta in virgola mobile influisce sul tempo.

Ci sono stati test che eseguivano previsioni meteorologiche con gli stessi input su hardware diverso e le previsioni divergevano. Se stai eseguendo un algoritmo iterativo, una piccola differenza di arrotondamento qui o là può causare un effetto farfalla che trasforma il sole in pioggia.

Le regole di arrotondamento negli standard (IEEE 754, ISO / IEC 10967) sono state attentamente studiate in modo che gli algoritmi numerici si comportino in modo prevedibile con la massima precisione e riproducano sempre lo stesso risultato. Non seguendo gli algoritmi numerici standard progettati per quelle regole di arrotondamento si romperà e gli algoritmi iterativi come le previsioni meteorologiche possono persino dare un risultato casuale.

(e questo non dice qualcosa sulle previsioni del tempo? :)


1
D'altra parte, se l'effetto farfalla cambia la luce del sole in pioggia, i risultati non saranno comunque utili.
gnasher729,

Una volta, ho salvato i dati float in ASCII con cifre insufficienti. Un client voleva mostrarmi un problema, ma dopo aver ripristinato i dati dal file ASCII, il problema è svanito. Ho detto che un po 'di tempo non dovrebbe importare, se il suo problema era mal condizionato, non c'è nulla che io possa fare comunque. Disse che erano affari suoi, il mio era quello di fornire software che consentisse la riproducibilità dei propri problemi. Lui aveva ragione.
aka.nice

Ecco perché dovresti generare numeri in virgola mobile per i salvataggi come esadecimali usando% a.
Goswin von Brederlow,
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.