为什么 x*x 和 x**2 可以返回不同的结果?

10
x = 1.5 * 10 ** 156
print(x * x)
print(x ** 2)

x * xx ** 2在数学上是等价的。但是当x很大时,前者可能返回inf的结果,而后者会引发溢出错误。

inf
Traceback (most recent call last):
  File "C:\Users\diana\miniconda3\envs\py37\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 3, in <module>
OverflowError: (34, 'Result too large')

为什么会这样呢?

这可能会有所帮助:Python:为什么一个大浮点数会自动变成inf。将x转换为整数会得到正确的值。 - undefined
1
要得到正确的答案,首先需要将x创建为一个整数,而不是从浮点数转换为整数。例如,尝试int(1.5*10**156) == 15*10**155 - 结果是False。或者执行print(int(1.5*10**156))来查看中间浮点数的有限精度的影响。 - undefined
请注意,触发此差异的最小值为 math.nextafter(math.sqrt(sys.float_info.max), math.inf) - undefined
1个回答

6
为什么乘法和指数运算之间会有差异?
这可能深深地埋藏在历史的迷雾中,当Python首次编写时。Python中的浮点数乘法必须遵循IEEE-754标准设定的规则,其中乘法溢出会变成特殊值float('inf')。
但由于某种原因,设计Python的指数运算符和pow()函数的人做出了不同的决定,它会引发OverflowError。
这种差异可能没有真正的逻辑依据。很可能只是某个人当时认为这是个好主意。 来源

4
请注意,IEEE754语义仅在Python 3.11中被要求,之前对于float语义,Python并不关心。它对于double类型接受C编译器提供的任何值都是满意的(在绝大多数系统上,这确实是IEEE754二进制64位浮点数)。https://stackoverflow.com/q/70184494/1358308提供了更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接