2013-05-16 4 views
8

In Xcode, das kompiliert fein:Die Differenz zwischen max und fmax (Cross-Plattform Compilierung)

float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius)); 

jedoch in Visual Studio 2010 es Fehler, und ich habe max verwenden anstelle von fmax. distanceSqrd und cRadius sind beide Floats.

Es ist der einzige Teil meines Codes, die sich nahtlos nicht kompilieren überqueren ...

Irgendwelche Ideen, warum?

+0

mögliche Duplikate von [Verwendung von Min- und Max-Funktionen in C++] (http://stackoverflow.com/questions/1632145/use-of-min-and-max-functions-in-c) – stijn

+0

Ich bin mir sicher, Ihre Programm war ein bisschen länger als das ('# include'?) –

+0

Nun, einer stammt aus C99, der andere aus C++ 98 ... – PlasmaHH

Antwort

16

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

Der eigentliche Unterschied ist, dass fmin und fmax sind mathematische Funktionen auf Arbeits Gleitkommazahlen und Ursprung von C99 (und könnte intrinsisch durch tatsächliche spezielle CPU-Anweisungen, wo möglich umgesetzt werden), während min und max sind die allgemeinen Algorithmen verwendbar auf jedem Typ unterstützt < (und sind wahrscheinlich nur eine einfache (b<a) ? b : a anstelle einer Fließkomma-Anweisung, obwohl eine Implementierung könnte sogar das mit einer Spezialisierung von min und max tun, aber ich bezweifle das).

Sie verhalten sich auch leicht unterschiedlich für spezielle Gleitkomma Argumente. Obwohl nicht genau angegeben ist, wie min und max auf NaN reagieren, denke ich (obwohl aus der obigen Definition immer der 1. Operand zurückgegeben werden sollte), fmin und fmax sind eindeutig angegeben, um immer das andere (nicht NaN) Argument zurückzugeben wenn man NaN ist, wenn die Implementierung IEEE 754 konform ist (was jede moderne PC-Implementierung normalerweise ist).

Verwandte Themen