c++ epsilon - Perché numeric_limits::min restituisce un valore negativo per int ma valori positivi per float / double?



max (3)

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

Produzione:

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

Da cppreference:

Restituisce il valore finito minimo rappresentabile dal tipo numerico T.

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

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


Answers

Per definizione, per i tipi a virgola mobile, min restituisce il più piccolo valore positivo che il tipo può 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 è così, posso solo ipotizzare che il comitato Standard avesse bisogno di 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 delle #define correlate nello standard C è confusa più o meno allo stesso modo.


È 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".

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


  • usando : lo userai
  • namespace : per usare cosa? Uno spazio dei nomi
  • std : lo spazio dei nomi std (dove sono dichiarate le caratteristiche della libreria standard C ++, come string o vector ).

Dopo aver scritto questa istruzione, se il compilatore vede una string , saprà che potresti std::string a std::string , e se vedrà il vector , saprà che potresti std::vector a std::vector . (A condizione che tu abbia incluso nella tua unità di compilazione i file di intestazione dove sono definiti, ovviamente).

Se non lo scrivi, quando il compilatore vede la string o il vector non saprà a cosa ti stai riferendo. Dovrai dire esplicitamente a std::string o std::vector , e se non lo fai, otterrai un errore di compilazione.





c++ std numeric-limits