Bei GCC aktivieren wir -ffast-math
, um Gleitkommaberechnungen zu beschleunigen. Da wir uns aber auf das korrekte Verhalten von NaN- und Inf-Gleitkommawerten verlassen, aktivieren wir auch -fno-finite-math-only
, so dass Optimierungen, die Werte annehmen, nicht NaN / Inf
Bei MSVC ist das "Äquivalent" zu -ffast-math
anscheinend /fp:fast
. Wie GCCs -ffast-math
enthält es jedoch auch die Optimierungen, die davon ausgehen, dass Nan / Inf nicht vorhanden sind. (Kritisch ist, scheint Tests wie std :: isnan () sind nicht garantiert, um "genaue" Ergebnisse zu geben.)
Gibt es eine Option für die MSVC C ++ - Kompilierung, mit der Sie die meisten /fp:fast
-Optimierungen nutzen können, aber NaN- und Inf-Werte trotzdem "richtig" behandelt? (Oder zumindest garantiert, dass Tests wie std :: isnan () / std :: isinf () NaN / Inf erkennen, wenn sie zufällig generiert werden.)
Im Gegensatz zu GCC optimiert MSVC (CL RC 19) nicht wirklich std::isnan
in der Einstellung /fp:fast
:
Eine weitere Alternative, die niemals optimiert wird, ist das Aufrufen des C99 isnan
oder des MSVC intrinsic _isnanf
. Oder rolle deinen eigenen nan
Test gegen eine bekannte Bitmaske, die mit std::numeric_limits::quiet_NaN
generiert werden kann.
Siehe: Ссылка
Tags und Links c++ visual-c++ ieee-754