Der Unterschied zwischen max und fmax (plattformübergreifendes Kompilieren)

8

In Xcode wird dies kompiliert:

%Vor%

In Visual Studio 2010 wird es jedoch fehlerhaft, und ich muss max anstelle von fmax verwenden. distanceSqrd und cRadius sind beide Floats.

Es ist der einzige Teil meines Codes, der nicht nahtlos kompiliert ...

Irgendwelche Ideen warum?

    
Ian 16.05.2013, 10:06
quelle

1 Antwort

16

Die Funktionen std::fmax und std::fmin aus dem <cmath> Header (oder fmax und fmin von <math.h> ) sind ein C ++ 11 Feature und zusammen mit vielen anderen neuen mathematischen Funktionen ein < em> Visual Studio 2010 unterstützt noch nicht (auch nicht 2012 ). Für die Portabilität ist es ratsam, sie durch std::min und std::max von <algorithm> zu ersetzen.

Der tatsächliche Unterschied ist, dass fmin und fmax mathematische Funktionen sind, die mit Gleitkommazahlen arbeiten und aus C99 stammen (und können intrinsisch von tatsächlichen spezialisierten CPU-Anweisungen implementiert werden, wo dies möglich ist ), während min und max allgemeine Algorithmen sind, die für jeden Typ verwendet werden können, der < unterstützt (und wahrscheinlich nur ein einfaches (b<a) ? b : a anstelle einer Fließkomma-Anweisung ist, obwohl eine Implementierung das sogar mit einer Spezialisierung von% tun könnte) co_de% und min , aber ich bezweifle das).

Sie verhalten sich auch leicht anders für spezielle Gleitkomma-Argumente. Obwohl nicht vollständig angegeben ist, wie max und min auf max s reagieren, denke ich (obwohl sie aus der obigen Definition immer den 1. Operanden zurückgeben sollten), sind NaN und fmin eindeutig angegeben gib immer das andere (nicht fmax ) Argument zurück, wenn eins NaN ist, wenn die Implementierung IEEE 754 konform ist (was eine moderne PC Implementierung normalerweise ist).

    
Christian Rau 16.05.2013, 10:49
quelle

Tags und Links