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?

È stato utile?

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.

  1. 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.
  2. 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.
  3. 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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top