std :: pow erzeugt unterschiedliche Ergebnisse in 32-Bit- und 64-Bit-Anwendungen

Ich habe die Nichtübereinstimmung im Ergebnis einiger komplexer Berechnungen gefunden. Wenn ich die Zwischenergebnisse genau beobachte, ist es die std :: pow-Funktion, die diese Nichtübereinstimmung hervorruft. Unten sind die Ein- / Ausgänge.

long double dvalue = 2.7182818284589998;
long double dexp = -0.21074699576017999;
long double result = std::powl( dvalue, dexp); 

64bit -> Ergebnis = 0,80997896907296496 und 32bit -> Ergebnis = 0,80997896907296507

Ich verwende VS2008. Ich habe es mit einer anderen Variante der pow-Funktion versucht, die long double und return long double benötigt, aber immer noch den gleichen Unterschied sieht.

double pow( double base, double exponent );

long double powl( long double base, long double exponent );

Ich habe einige Informationen dazu gelesen:

Intel x86-Prozessoren verwenden intern eine erweiterte 80-Bit-Genauigkeit, wohingegen double normalerweise eine 64-Bit-Breite aufweist. Unterschiedliche Optimierungsstufen wirken sich darauf aus, wie oft Gleitkommawerte von der CPU im Speicher gespeichert und somit von einer 80-Bit-Genauigkeit auf eine 64-Bit-Genauigkeit gerundet werden. Verwenden Sie alternativ den langen Double-Typ, der in gcc normalerweise 80 Bit breit ist, um eine Rundung von 80 Bit auf 64 Bit zu vermeiden.

Kann mir jemand klar machen, welchen Unterschied es gibt und wie ich diesen Unterschied überwinden kann.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage