2013-06-12 12 views
27

Dlaczego numer: numeric_limits :: min zwraca wartość ujemną dla int, ale wartości dodatnie dla np. pływak i podwójne?Dlaczego liczba_kamców :: min zwraca wartość ujemną dla int, ale wartości dodatnie dla wartości zmiennoprzecinkowej/podwójnej?

#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; 
} 

wyjściowa:

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

Od cppreference:

Zwraca minimalną wartość skończoną reprezentowalna przez numeryczną typu T.

Dla typów zmiennoprzecinkowych z denormalizacji , min zwraca min. pozytywny nie spersonalizowana wartość. Należy zauważyć, że to zachowanie może być nieoczekiwane., , szczególnie w porównaniu do zachowania min dla typów integralnych. Aby znaleźć wartość, która nie ma wartości mniejszej niż , użyj numeric_limits::lowest.

min ma znaczenie tylko dla typów ograniczonych i dla typów nieograniczonych bez znaku, to znaczy, że typy reprezentujące nieskończony zestaw wartości ujemnych nie mają znaczącego minimum.

+0

Dla wartości zmiennoprzecinkowych wartość min określa się jako najmniejszą * dodatnią * liczbę, która jest dokładnie reprezentowana przez dany typ. –

Odpowiedz

30

Z definicji, dla pływających typów min zwraca najmniejszą wartość dodatnią typu mogą kodować, a nie najniższą. Aby uzyskać najniższą wartość, należy użyć numeric_limits::lowest.

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

chodzi o dlaczego to w ten sposób, mogę tylko spekulować, że komisja standardowa potrzeba mieć sposób do reprezentowania wszystkich form skrajnych wartości dla wszystkich rodzajów rodzimych. W przypadku typów integralnych istnieją tylko dwa typy skrajności: maksimum dodatnie i maksimum ujemne. Dla pływaków jest jeszcze jeden: najmniejszy możliwy.

Jeśli sądzisz, że semantyka jest nieco pomieszana, zgadzam się. Semantyka pokrewnych #define s w standardzie C jest pomieszana w podobny sposób.

+0

Dzięki za spekulacje. Ma sens, że potrzebujemy informacji o obu najmniejszych możliwych typach. Po prostu uznałem za dziwne, że oba są również zdefiniowane dla liczb całkowitych, chociaż zwracają tę samą wartość. Pomyślałem, że być może był to głębszy powód. – gnzlbg

+4

@gnzlbg: Nie wiem, dla certian, ale wątpię, by był jakiś głębszy powód niż po prostu "Tak zrobił C". –

+0

czy jesteś pewny co do "najmniejszej wartości dodatniej"? Wynik z PO wygląda negatywnie na int, a cppreference.com mówi "najmniejsza skończona wartość".Mój kompilator jest (nadal) niezgodny z C++ 11, więc nie mogę używać najniższego :-( – craq

5

To niefortunne, ale za podobnymi nazwami kryje się zupełnie inne znaczenie. Zostało to trochę przeniesione z C, gdzie DBL_MIN i INT_MIN mają ten sam "problem".

Ponieważ niewiele można zrobić, pamiętaj tylko, co oznacza co.