为何0.0与±Inf相乘得NaN,其他有限数与±Inf相乘得±Inf?
为什么0.0与±Inf相乘得NaN,非零有限数与±Inf相乘得±Inf?
这是由IEEE 754浮点运算标准规定的,绝大多数现代编程语言(包括C++)都遵循这一标准,背后的逻辑是数学上的合理性:
对于非零有限数和±Inf的乘法:
逻辑上,一个非零的有限数值乘以无限大的数,结果必然还是无限大,符号由两个操作数的符号共同决定(比如负数×正无穷得到负无穷),这符合直观的数学推导。对于0和±Inf的乘法:
这属于数学上的未定式——你无法通过极限确定唯一结果:
比如当x趋近于0、y趋近于正无穷时,x*y可能趋近于1(x=1/y)、2(x=2/y),也可能趋近于0或无穷大。因为没有确定的结果,IEEE 754标准规定这种运算的结果为NaN(Not a Number),用来表示“无法确定的数值”。
验证代码
#include <iostream> #include <limits> using namespace std; int main() { constexpr double INF = numeric_limits<double>::infinity(); cout << 0.0 * INF << endl; cout << -5.0 * INF << endl; }
程序输出
-nan(ind) -inf
内容的提问来源于stack exchange,提问作者Edison von Myosotis
相关产品推荐
相关产品推荐

