x86-64 lunga doppia precisione
-
04-10-2019 - |
Domanda
Qual è la precisione reale di lungo doppio su piattaforme Intel a 64 bit? è 80 bit imbottita a 128 o 128 bit effettivo?
Se l'ex, oltre ad andare gmp, c'è un'altra opzione per raggiungere la vera 128 di precisione?
Soluzione
precisione x86-64 è lo stesso di X 86 regolare. Esteso doppia è 80 bit, usando l'x87 ISA, con byte aggiunto 6 imbottitura. Non v'è alcun hardware FP 128-bit.
Un'implementazione software del quad o estesa quad precisione potrebbe beneficiare x86-64 64x64 => 128 intero un'istruzione di moltiplicazione, però.
Altri suggerimenti
Ti consiglio di utilizzare MPFR . Si tratta di un più sofisticato biblioteca punto di precisione multipla flottante che è costruito sulla cima di GMP.
C'è una buona probabilità che è a 64 bit per entrambi (a seconda del compilatore e OS), perché il compilatore emette scalare SSE2 anziché x87 istruzioni.
86 non supporta la precisione superiore a 80 bit, ma se si ha realmente bisogno di più di 64 bit per un algoritmo FP molto probabilmente si dovrebbe controllare i valori numerici invece di risolvere il problema con la forza bruta.
Ci sono un paio di opzioni.
- uso doppia-doppia per rappresentare quad. Ad esempio, vedere http://www.codeproject.com/Articles/884606 / Il-doppia-doppia-tipo. Tuttavia, il tipo non conferma lo standard IEEE. Si può dire ispezionando il suo valore epsilon essere meno accurata rispetto IEEE float standard 128-bit, che è 1.926E-34.
- utilizzare veri IEEE standard di carri a 128 bit. Microsoft VC ++ compiler non fornisce questo tipo. Intel C ++ Compiler fornisce un tipo _Quad, anche se la sua attuazione non è completa (nessuna operazione di I / O) in questo momento.
- utilizzare libreria di terze parti. Recentemente ho creato una chiamata double128 libreria che si basa su Intel C ++ _Quad ma aggiunge le operazioni di I / O. Funziona con Microsoft VC ++. È possibile visitare http://www.cg-inc.com/Product/Double128 ulteriori informazioni.
Vi consiglio i wrapper Boost oltre MPFR o GMP:
Boost 1.70: cpp_bin_float .
Oltre tipi arbitrario a qualsiasi precisione desiderata, vengono forniti i seguenti tipi:
cpp_bin_float_single (24 bits + mantissa = 32 bits)
cpp_bin_float_double (53 bits + mantissa = 64 bits)
cpp_bin_float_double_extended (64 bits + mantissa)
cpp_bin_float_quad (113 bits + mantissa = 128 bits)
cpp_bin_float_oct (237 bits) + mantissa = 256 bits)
offerte Boost funzionalità quasi out-of-the-box. Una volta compilato, tutto quello che bisogna fare è aggiungere un puntatore all'interno del progetto di Visual Studio per l'inclusione e la directory di libreria.
Testato con Visual Studio 2017 + Boost v1.70.
spinta .