complex(“inf”) ** 1 抛出 OverflowError

complex("inf") ** 1 throws OverflowError

提问人:Petr 提问时间:10/21/2023 最后编辑:Karl KnechtelPetr 更新时间:10/22/2023 访问量:115

问:

在 Python 3.10.9 中,此示例引发:OverflowError: complex exponentiation

complex("inf") ** 1

但这有效,评估为:(nan+nanj)

complex("inf") ** 2

为什么它以这种方式工作?是否有要报告的错误?

Python 无限 复杂类型

评论

2赞 Abdul Niyas P M 10/21/2023
这似乎与这个问题有关
0赞 Max 10/21/2023
那里的答案似乎表明了它不一致的原因:它执行所有中间步骤,然后检查其中是否有任何一个是无限的,如果是,则抛出 OverflowError。当 ** 2 时,中间值变为 NaN,这不会触发错误。我认为这可以处理得更好。
0赞 Max 10/21/2023
这回答了你的问题吗?在什么情况下,Python 复数幂会抛出 OverflowError?
0赞 Max 10/21/2023
基本上,算法的无意副作用。

答:

-3赞 DataAngel 10/21/2023 #1
import math

Infinity = complex(math.inf, 0) # or complex("inf") whichever returns (inf+0j)
print(Infinity)

result0 = Infinity ** 2
print(result0) # prints (nan+nanj)

result1 = Infinity ** 1
print(result1) # prints OverflowError: complex exponentiation

嘿彼得! 你明白了,因为复杂类不支持无限值的 ** 运算符。

** 运算符在 Python 中用于幂。 当应用于复数时,它会将第一个数字提高到第二个数字的幂。 但是,如果其中任何一个数字是无限的,则结果是未定义的。

此编程行为由 IEEE 754 浮点标准定义。 在此标准中,一些规则控制涉及“inf”和“nan”的操作,这些规则在大多数编程语言(包括 Python)中一致地实现。

复合体(“INF”) ** 1:

在这种情况下,您将无穷大提高到 1 的幂。 根据规则,任何提高到 1 的幂都保持不变。 因此,结果是 inf(正无穷大)。所以 python 无法在这里计算它并给你一个错误。

复合体(“INF”) ** 2:

在这里,你正在平方无穷大。 根据规则,这会产生一个复数,其实部为“inf”,虚部为“nan”

但是,Python 选择使用特殊值 NaN(不是数字)来表示未定义的值。 因此,complex(math.inf, 0) ** 2 的结果是 (nan+nanj)。

因此,这里没有与这些操作相关的隐藏错误。

评论

0赞 DataAngel 10/21/2023
@simon我从这里得到它 geeksforgeeks.org/ieee-standard-754-floating-point-numbers
4赞 snakecharmerb 10/21/2023
我不知道你为什么被否决,但如果在 Python 中可以表示,那么你就不能只是挥手引发错误,因为它应该是一个空操作。complex('inf')complex('inf') ** 1
1赞 simon 10/21/2023
@snakecharmerb因为你刚才写的东西,我对答案投了反对票。此外,第二种情况也没有意义:即使 complex(“inf”) ** 2 被解释为 complex(“inf”) * complex(“inf”),那么根据 DataAngel 引用的表,答案应该是 inf+0j 而不是 nan+nanj。所以第二部分也是挥手。因此,总而言之,这两种情况都不能用 DataAngel 在其评论中引用的网站上的信息来争论。
1赞 ti7 10/22/2023
@DataAngel不要因为反对票而气馁,它们是生活中的事实,相反,请尝试写一个好的答案 - 此外,请不要破坏您的帖子 meta.stackoverflow.com/questions/372007/......
2赞 simon 10/22/2023
@DataAngel 我为我关于使用 ChatGPT 的评论道歉,并已将其删除。很明显,你已经把自己的想法投入到了答案中。不过,我支持我的反对票:我仍然相信你的答案在事实上是不正确的——这是投反对票的正当理由。我试图在评论中阐明我的理由,为什么我认为这是错误的。不要气馁。再试一次,不要苦涩,继续前进。答案不是根据你的声誉来判断的(至少,它们不应该是),而是根据它们的质量来判断。