2013-06-12 5 views
27

Warum macht numeric_limits :: min einen negativen Wert für int, aber positive Werte für z. schweben und doppelt?Warum gibt numeric_limits :: min einen negativen Wert für int zurück, aber positive Werte für float/double?

#include<iostream> 
#include<limits> 

using namespace std; 

int main() { 
    cout << "int: " << numeric_limits<int>::min() << " " 
     << "float: " << numeric_limits<float>::min() << " " 
     << "double: " << numeric_limits<double>::min() << "\n"; 
    return 0; 
} 

Ausgang:

int: -2147483648 float: 1.17549e-38 double: 2.22507e-308 

Von cppreference:

Gibt den minimalen endlichen Wert darstellbare vom numerischen Typ T.

Für Gleitkommatypen mit Denormalisierung , min gibt das Minimum positive nein zurück erwarteter Wert. Beachten Sie, dass dieses Verhalten möglicherweise unerwartet ist, insbesondere im Vergleich zu dem Verhalten von min für integrale Typen. Um den Wert zu finden, der keine Werte hat, die kleiner sind, verwenden Sie numeric_limits::lowest.

min ist nur sinnvoll für beschränkte Typen und für unbeschränkte unsigned Typen, das heißt, die Art, das eine unendliche Menge negativer Werte haben keine sinnvolle Mindest darstellen.

+0

Für Fließkommawerte wird min als die kleinste * positive * Zahl definiert, die von diesem Typ genau dargestellt werden kann. –

Antwort

30

Per Definition für schwimmende Typen, min gibt den kleinsten positiven Wert kann die Art, nicht auf die niedrigste kodieren. Wenn Sie den niedrigsten Wert verwenden möchten, verwenden Sie stattdessen numeric_limits::lowest.

Dokumentation: http://en.cppreference.com/w/cpp/types/numeric_limits/min

Was warum es so ist, kann ich nur spekulieren, dass der Standard-Ausschuss einen Weg benötigt, um alle Formen der Extremwerte für alle unterschiedlichen nativen Typen darzustellen. Bei ganzzahligen Typen gibt es nur zwei Arten von Extremwerten: max. Positiv und max. Negativ. Für Schwimmer gibt es ein anderes: kleinstmöglich.

Wenn Sie denken, dass die Semantik etwas durcheinander ist, stimme ich zu. Die Semantik der verwandten #define s im C-Standard sind in ähnlicher Weise verwechselt.

+0

Danke für die Spekulation. Es macht Sinn, dass man Informationen über beide kleinstmöglichen Typen benötigt. Ich fand es einfach komisch, dass beide auch für ganze Zahlen definiert sind, obwohl sie den gleichen Wert zurückgeben. Dachte, dass es vielleicht einen tieferen Grund dafür gab. – gnzlbg

+4

@ gnzlbg: Ich weiß nicht für certian, aber ich bezweifle, es gibt einen Grund tiefer als einfach "Das ist, was C getan hat." –

+0

Sind Sie sicher, dass "der kleinste positive Wert"? Die Ausgabe vom OP sieht negativ für int aus, und cppreference.com sagt "kleinsten endlichen Wert".Mein Compiler ist (noch) nicht C++ 11-konform, daher kann ich nicht die niedrigste verwenden :-( – craq

5

Es ist bedauerlich, aber hinter ähnlichen Namen liegt eine völlig andere Bedeutung. Es wurde irgendwie von C übernommen, wo DBL_MIN und INT_MIN das gleiche "Problem" haben.

Da nicht viel getan werden kann, nur daran erinnern, was was bedeutet.

Verwandte Themen