numeric_limits c++




¿El inverso de std:: numeric_limits:: infinity() es cero? (3)

Cualquier número finito dividido por infinito da como resultado cero bajo IEEE 754 (y, por lo tanto, igual en la mayoría de las implementaciones típicas de C ++).

Si el signo del numerador y el denominador difieren, el resultado será un cero negativo, que es igual a cero.

¿Hay algo en el estándar de C ++ (o el estándar de punto flotante IEEE 754) que garantice que 1./std::numeric_limits<double>::infinity() es cero (o al menos un número pequeño)?


IEEE 754-2008 6.1 dice:

El comportamiento del infinito en la aritmética de punto flotante se deriva de los casos limitantes de la aritmética real con operandos de magnitud arbitrariamente grande, cuando existe tal límite. Las infinidades se interpretarán en el sentido afín, es decir: −∞ <{cada número finito} <+ ∞.

Las operaciones en operandos infinitos son generalmente exactas y por lo tanto no indican excepciones, ...

Dado que el límite de 1 / x a medida que x aumenta sin límite es cero, una consecuencia de esta cláusula es que 1 / ∞ es cero.

La cláusula 6.3 nos dice que el signo del resultado es +:

Cuando ni las entradas ni el resultado son NaN, el signo de un producto o cociente es el OR exclusivo de los signos de los operandos; ...


if(std::numeric_limits<double>::is_iec559) yes(); else no();

(ver 18.3.2.4)

IEC 559, que es idéntico a IEEE 754, garantiza que ese sea el caso. Sin embargo, C ++ no garantiza de ninguna manera que IEC 559 esté en su lugar (aunque el 99.99% del tiempo es lo que sucede, de todas formas, debe verificarlo).





infinity