libreria int_min float dbl_max cplusplus climits biblioteca c++ integer numeric limits integral

c++ - int_min - ¿Por qué es numeric_limits<int>:: max()> numeric_limits<int>:: infinity()?



libreria limits c++ (4)

La función numeric_limits<T>::infinity() tiene sentido para aquellas T para las cuales numeric_limits<T>::has_infinity devuelve true .

En el caso de T=int , devuelve false . Así que esa comparación no tiene sentido, porque numeric_limits<int>::infinity() no devuelve ningún valor significativo con el que comparar.

Estaba leyendo Configuración de un int a Infinity en C ++ . Entiendo que cuando uno necesita el infinito verdadero, se supone que debe usar numeric_limits<float>::infinity() ; Supongo que la razón detrás de esto es que generalmente los tipos integrales no tienen valores designados para representar estados especiales como NaN , Inf , etc. como lo hacen los flotadores IEEE 754 (de nuevo C ++ no obliga a ninguno - int & float utilizado se deja a la implementación) ; pero aún así es engañoso que max > infinity para un tipo dado. Estoy tratando de entender la razón detrás de esta llamada en el estándar. Si tener infinity no tiene sentido para un tipo, ¿no debería ser rechazado en lugar de tener una bandera para verificar su validez?


Si lee, por ejemplo, esta referencia , verá una tabla que muestra que el infinito es cero para los tipos de enteros. Esto se debe a que los tipos de enteros en C ++ no pueden, por definición, ser infinitos.


Supongamos, a la inversa, que el estándar reservaba algún valor para representar la inifidad y que numeric_limits<int>::infinity() > numeric_limits<int>::max() . Eso significa que habría algún valor de int que sea mayor que max() , es decir, algún valor representable de int es mayor que el valor más grande representable de int.

Claramente, cualquiera que sea la forma en que lo especifique el Estándar, se viola cierta comprensión natural. O bien inifinity() <= max() , o existe x tal que int(x) > max() . El Estándar debe elegir qué regla de la naturaleza violar.

Creo que eligieron sabiamente.


numeric_limits<int>::infinity() devuelve la representación de infinito positivo, si está disponible.

En el caso de los enteros, el infinito positivo no existe:

cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;

huellas dactilares

int has infinity: false