IEEE-754 Fließkommaberechnungen, Gleichheit und Verengung

8

Im folgenden Code sollen die Funktionen foo1, foo2 und foo3 gleichwertig sein. Jedoch, wenn run foo3 nicht aus der Schleife beendet, gibt es einen Grund, warum dies der Fall ist?

%Vor%

Hinweis: Dies wurde mit VS2010 mit / fp präzise im Freigabemodus kompiliert. Nicht sicher, wie GCC usw. diesen Code behandeln würde, würde jede Information groß sein. Könnte das ein Problem sein, bei dem in foo3 die x- und x + 1-Werte irgendwie zu NaN werden?

    
Gelly Ristor 23.05.2012, 03:51
quelle

1 Antwort

13

Was passiert, ist höchstwahrscheinlich das Folgende. Auf dem x86-Bogen können Zwischenberechnungen mit 80 Bits Genauigkeit durchgeführt werden (langes Doppel ist der entsprechende C / C ++ - Typ). Der Compiler verwendet alle 80 Bits für die Operation (+1) und für die Operation (! =), Schneidet aber die Ergebnisse vor dem Speichern ab.

Was Ihr Compiler wirklich tut, ist dies:

%Vor%

Dies ist absolut nicht IEEE-konform und verursacht endlose Kopfschmerzen für alle, aber dies ist die Standardeinstellung für MSVC. Verwenden Sie das /fp:strict Compiler-Flag, um dieses Verhalten zu deaktivieren.

Dies ist meine Erinnerung an das Problem von vor etwa 10 Jahren, also bitte vergib mir, wenn das irgendwie nicht ganz korrekt ist. Sehen Sie dies für die offizielle Microsoft-Dokumentation .

BEARBEITEN Ich war sehr überrascht zu erfahren, dass g ++ standardmäßig genau dasselbe Verhalten zeigt (auf i386 linux, aber nicht auf -mpfpmath = sse).

    
n.m. 23.05.2012, 06:38
quelle