Esistono implementazioni standard IEEE 754 per le primitive Java in virgola mobile?


Mi interessa se Java sta usando lo standard IEEE 754 per implementare la sua aritmetica in virgola mobile. Qui Ho visto questo genere di cose nella documentazione:

Operazione definita in IEEE 754-2008

Come ho capito il lato positivo di IEEE 754 è quello di aumentare la precisione dell'aritmetica in virgola mobile, quindi se userò double o float in Java la presisione dei calcoli sarebbe la stessa di BigDecimal? E se no che senso ha usare IEEE 754 standard in Math classe?

Author: Wai Ha Lee, 2016-10-28

1 answers

Mi interessa se Java sta usando lo standard IEEE 754 per implementare la sua aritmetica in virgola mobile.

IEEE-754 definisce gli standard per più tipi a virgola mobile. Per molti anni, erano tutti binari in virgola mobile; questo è ciò che sono float e double di Java: float è un valore in virgola mobile binario IEEE-754 a 32 bit (ciò che lo standard chiama binary32). double è a 64 bit (ciò che lo standard chiama binary64). Questi binari i numeri in virgola mobile sono molto efficienti per i computer da calcolare, ma poiché funzionano in binario e lavoriamo in decimale, ci sono alcuni disallineamenti delle aspettative; ad esempio, 0.1 non può essere memorizzato con precisione in un double, e si ottengono stranezze come 0.1 + 0.2 che si rivelano 0.30000000000000004. Vedi La matematica in virgola mobile è rotta? per i dettagli. Non sono una buona scelta per i calcoli finanziari, per esempio.

BigDecimal è una classe Java che implementa decimale numeri frazionari con precisione arbitraria. È molto più lento dell'uso di double, ma i risultati si adattano alle nostre aspettative decimali (ad esempio, 0.1 + 0.2 sarà 0.3).

L'edizione 2008 di IEEE-754 aggiunge nuovi formati significativi, in particolare decimal32, decimal64, e decimal128. Questi sono decimali in virgola mobile, e quindi funzionano allo stesso modo che facciamo noi. 0.1 può essere accuratamente memorizzato in un decimal64. 0.1 + 0.2 è 0.3 in decimal64. Tuttavia, per quanto posso dire, non sono realmente rilevanti per la tua domanda.

Poiché BigDecimal precede IEEE-754 2008 (con qualche margine), definisce la propria semantica.

E se non che senso ha usare lo standard IEEE 754 in classe matematica?

JDK9 aggiunge nuove operazioni a Math che eseguono operazioni definite dalle specifiche IEEE-754 2008 (ad esempio fma, che fa un fuso multiply-add), e quindi definisce quelle operazioni con riferimento al IEEE-754 2008 spec, per chiarezza.

Più lettura:

 17
Author: T.J. Crowder, 2018-08-02 08:57:19