2013-06-12 10 views
27

Perché fa numeric_limits :: min restituisce un valore negativo per int, ma valori positivi per es. fluttuare e raddoppiare?Perché numeric_limits :: min restituisce un valore negativo per int ma valori positivi per 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; 
} 

uscita:

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

Da cppreference:

Restituisce il rappresentabile minimo valore finito per il tipo T. numerico

Per i tipi a virgola mobile con denormalizzazione , min restituisce il numero minimo positivo valore rmalizzato. Si noti che questo comportamento potrebbe essere inaspettato, in particolare se confrontato con il comportamento di min per i tipi interi. Per trovare il valore che non ha valori inferiori, utilizzare numeric_limits::lowest.

min è significativo solo per i tipi con limiti e per tipi senza segno senza limiti, ovvero i tipi che rappresentano un insieme infinito di valori negativi non hanno un minimo significativo.

+0

Per i valori in virgola mobile, min è definito come il più piccolo * numero * positivo che è esattamente rappresentabile da quel tipo. –

risposta

30

Per definizione, per i tipi di galleggianti, min restituisce il più piccolo valore positivo del tipo in grado di codificare, non il più basso .

Se si desidera il valore più basso, utilizzare invece numeric_limits::lowest.

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

Per quanto riguarda il motivo per cui è in questo modo, posso solo ipotizzare che il comitato di standard necessario per avere un modo per rappresentare tutte le forme di valori estremi per tutti i diversi tipi nativi. Nel caso di tipi interi, ci sono solo due tipi di estremo: massimo positivo e massimo negativo. Per i galleggianti ce n'è un altro: il più piccolo possibile.

Se pensi che la semantica sia un po 'confusa, sono d'accordo. La semantica dei relativi #define s nello standard C è confusa più o meno allo stesso modo.

+0

Grazie per la speculazione. Ha senso che ci sia bisogno di informazioni su entrambi i tipi più piccoli possibili. Ho appena trovato davvero strano che entrambi siano definiti anche per numeri interi, sebbene restituiscano lo stesso valore. Pensavo che forse c'era una ragione più profonda per quello. – gnzlbg

+4

@gnzlbg: Non so per Certian, ma dubito che ci sia qualche ragione più profonda del semplice "Questo è quello che ha fatto C". –

+0

sei sicuro di quel "più piccolo valore positivo"? L'output dell'OP sembra negativo per int, e cppreference.com dice "il più piccolo valore finito".Il mio compilatore è (ancora) non conforme a C++ 11, quindi non posso usare il minimo :-( – craq

5

È sfortunato, ma dietro nomi simili si trova un significato completamente diverso. È stato trasferito da C, dove DBL_MIN e INT_MIN hanno lo stesso "problema".

Come non si può fare molto, basta ricordare cosa significa cosa.