c++ - tipos - ¿Por qué numeric_limits:: min devuelve un valor negativo para int, pero valores positivos para float/double?
unsigned int para que sirve (2)
¿ 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
Desde cppreference:
Devuelve el valor finito mínimo representable por el tipo numérico T.
Para los tipos de punto flotante con desnormalización, min devuelve el valor normalizado positivo mínimo. Tenga en cuenta que este comportamiento puede ser inesperado , especialmente cuando se compara con el comportamiento de min para tipos integrales. Para encontrar el valor que no tiene valores menores que él, use
numeric_limits::lowest
.min solo es significativo para los tipos acotados y para los tipos sin signo no acotados, es decir, los tipos que representan un conjunto infinito de valores negativos no tienen un mínimo significativo.
Es desafortunado, pero detrás de nombres similares se encuentra un significado completamente diferente. Fue un poco transferido desde C, donde DBL_MIN e INT_MIN tienen el mismo "problema".
Como no se puede hacer mucho, solo recuerda lo que significa que.
Por definición, para los tipos flotantes, min
devuelve el valor positivo más pequeño que el tipo puede codificar, no el más bajo .
Si desea el valor más bajo, use numeric_limits::lowest
lugar.
Documentación: http://en.cppreference.com/w/cpp/types/numeric_limits/min
En cuanto a por qué es así, solo puedo especular que el comité estándar necesitaba tener una forma de representar todas las formas de valores extremos para todos los tipos nativos diferentes. En el caso de los tipos integrales, solo hay dos tipos de extremo: máximo positivo y máximo negativo. Para las carrozas hay otra: la más pequeña posible.
Si crees que la semántica es un poco confusa, estoy de acuerdo. La semántica de los #define
s relacionados en el estándar C se confunden de la misma manera.