¿Por qué numerical limits:: min devuelve un valor negativo para int pero valores positivos para float / double?


¿Por qué numeric_limits::min devuelve un valor negativo para int, pero valores positivos para, por ejemplo, float y 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;
}

Salida:

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

De cppreference:

Devuelve el valor finito mínimo representable por el tipo numérico T.

Para tipos de coma flotante con desnormalización, min devuelve el mínimo valor normalizado positivo. Tenga en cuenta que este comportamiento puede ser inesperado, especialmente en comparación con el comportamiento de min para tipos integrales. A encuentre el valor que no tiene valores menores que él, use numeric_limits::lowest.

Min solo es significativo para tipos acotados y para tipos unbounded unsigned, es decir, tipos que representan un el conjunto infinito de valores negativos no tiene un mínimo significativo.

Author: gnzlbg, 2013-06-12

2 answers

Por definición, para los tipos flotantes, min devuelve el menor valor positivo que el tipo puede codificar, no el menor.

Si desea el valor más bajo, use numeric_limits::lowest en su lugar.

Documentación: http://en.cppreference.com/w/cpp/types/numeric_limits/min

En cuanto a por qué es de esta manera, solo puedo especular que el comité Estándar necesitaba tener una forma de representar todas las formas de valores extremos para todos los diferentes tipos nativos. En el en el caso de los tipos integrales, solo hay dos tipos de extremos: max positivo y max negativo. Para los flotadores hay otro: el más pequeño posible.

Si crees que la semántica está un poco confusa, estoy de acuerdo. La semántica de las #defines relacionadas en el estándar C se confunden de la misma manera.

 33
Author: John Dibling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-12 16:21:28

Es desafortunado, pero detrás de nombres similares se encuentra un significado completamente diferente. Fue un poco arrastrado de C, donde DBL_MIN e INT_MIN tienen el mismo "problema".

Como no se puede hacer mucho, solo recuerda qué significa qué.

 5
Author: Balog Pal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-12 16:20:01