std :: numeric_limits :: infinity()的逆数是否为零?

时间:2018-08-25 09:25:51

标签: c++ floating-point infinity

C ++标准(或IEEE 754浮点标准)中是否有任何东西可以保证1./std::numeric_limits<double>::infinity()为零(或至少是一个小数字)?

4 个答案:

答案 0 :(得分:15)

任何有限数除以无穷大在IEEE 754下都为零(因此在大多数典型的C ++实现中相同)。

如果分子和分母的符号不同,则结果为负零,等于零。

答案 1 :(得分:11)

是的,根据GNU C库参考手册(假定IEEE 754):

  

无限性通过计算传播   正如人们所期望的:例如2 +∞=∞,4 /∞=   0

https://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html

您可能要检查C ++编译器是否使用IEEE 754:

How to check if C++ compiler uses IEEE 754 floating point standard

答案 2 :(得分:4)

IEEE 754-2008 6.1说:

  

浮点算术中无穷大的行为是从存在实数的任意操作数的实数算术的极限情况(存在这种极限)得出的。无限性应在仿射意义上进行解释,即:-∞<{每个有限数} <+∞。

     

对无限操作数的操作通常是精确的,因此没有异常信号,……

由于随着 x 的无限增长,1 / x 的极限为零,因此该子句的结果是1 /∞为零。

第6.3条告诉我们结果的符号为+:

  

当输入或结果都不为NaN时,乘积或商的符号为操作数符号的异或;…

答案 3 :(得分:1)

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

(请参阅18.3.2.4)

与IEEE 754相同的IEC 559保证确实如此。但是,C ++不能以任何方式保证具备IEC 559(尽管在99.99%的情况下只是发生这种情况,您仍然需要进行验证以确保)。 >