Unterschied in der floating-point-Arithmetik zwischen x86 und x64

Stolperte ich über einen Unterschied in der Art floating-point-Arithmetik getan werden zwischen MS VS 2010 baut für x86 und x64 (sowohl ausgeführt auf die gleiche 64-bit-Maschine).

Dies ist ein reduziertes Codebeispiel:

float a = 50.0f;
float b = 65.0f;
float c =  1.3f;
float d = a*c;
bool bLarger1 = d<b;
bool bLarger2 = (a*c)<b;

Den booleschen bLarger1, ist immer falsch (d 65.0 in beiden builds).
Variable bLarger2 false für x64, aber wahr für x86!

Ich bin mir wohl bewusst floating-point-Arithmetik und Rundung-Effekte statt. Ich weiß auch, dass 32-bit manchmal verwendet verschiedene Anweisungen für Gleitkomma-Operationen als 64-bit-builds. Aber in diesem Fall bin ich es fehlten einige Informationen.

Warum gibt es eine Diskrepanz zwischen bLarger1 und bLarger2 auf den ersten Platz? Warum ist es nur auf der 32-bit-build?

Unterschied in der floating-point-Arithmetik zwischen x86 und x64

  • meine Vermutung ist, dass die x86-version ist die Verwendung der FPU-Register für, die und die x64 ist die Verwendung der SSE-Register für die. Aber Sie wahrscheinlich benötigen, zu betrachten, IL-code und auch in den Maschinen-code.
  • Sicherlich x86 ist mit x87-Einheit, und die x64 ist die Verwendung der SSE-Einheit. Aber es nicht wirklich erklären, den Unterschied. Sie sollten beide die gleiche Antwort erhalten. @Oliver kann Ihnen zeigen, wie Sie kompilieren den code, weil meiner ziemlich Versuch einer repro gescheitert. Beide bools sind false für x86 und x64 für mich.
  • OK, jetzt habe ich ein repro!
  • Es geht um die Art und Weise ein*c behandelt wird, in den Ausdruck für bLarger2. Ich denke, es wird eine float-mult in einem und ein Doppel-mult in die andere, oder so ähnlich
  • Die Frage ist, warum ist dies überraschend, wohl wissend, dass floating-point nicht genau. Je nach compiler, compiler-Optionen, etc. Ergebnisse können abweichen.
  • Auch der Unterschied zwischen den zwei Vergleich-Operationen auf der gleichen Plattform, die gleich Aussehen, war besonders verwirrend für mich
  • Während die floating point Arithmetik nicht exakt repräsentieren alle realen Werte, es ist wiederholbar und gut definiert. Es ist nicht unvernünftig, zu hoffen, dass für Kohärenz zwischen den verschiedenen Compilern.

Schreibe einen Kommentar