为什么Python中1e500 - 1e500的运算结果是nan而非0?
问题解答
该现象本质是浮点数表示边界+IEEE 754无穷运算规则共同作用的结果,原因拆解如下:
- Python默认使用IEEE 754双精度浮点数存储科学计数法表示的数值,该格式能表示的最大正有限值约为
1.7976931348623157e+308。代码中的1e500远大于这个上限,因此Python解析时会直接将其标记为inf(正无穷),而非实际的10^500数值。 - 按照IEEE 754浮点数标准的规定,正无穷
inf参与运算时遵循以下规则:inf减去任意有限数值,结果仍然是inf,这也是1e500 - 10000 = inf符合预期的原因,该运算结果完全符合标准定义。- 但
inf - inf的结果被明确定义为nan(Not a Number,非数值),而非0。这么定义的核心原因是:无穷不是一个确定的常量,两个无穷序列的差值没有唯一确定的结果——比如趋向无穷的2n和n相减结果还是无穷,趋向无穷的n+1和n相减结果是1,不存在通用的确定解,因此标准用nan标记这类无意义的运算结果。
为什么运算结果没有返回0?
你预设的“两个相同数值相减得0”的规则仅适用于有限数值,对没有确定大小的无穷不生效。你实际执行的运算不是两个相等的有限值1e500 - 1e500,而是两个inf相减,因此自然不会返回0。
内容的提问来源于stack exchange,提问作者Rolv Apneseth
相关产品推荐
相关产品推荐

