提问人:Kelly Bundy 提问时间:7/16/2022 更新时间:7/19/2022 访问量:155
为什么/如何 (-1) ** 0.5 不准确?
Why/how is (-1) ** 0.5 inaccurate?
问:
Python 计算虚数单位 i = sqrt(-1) 不准确:
>>> (-1) ** 0.5
(6.123233995736766e-17+1j)
应该是确切的(Python 称其为 j 而不是 i)。-1 和 0.5 都是精确表示的,结果也可以完全表示,因此 Python 无法正确表示它没有硬性理由(即浮点限制)。它可以。而 i=sqrt(-1) 的定义使得 Python 弄错了这一点相当令人失望。那么为什么会这样呢?它如何计算不准确的结果?1j
答:
当需要复杂的算术运算时,Python 实现可能会将 x y 计算为 e y ln x,就像使用复杂的 C 函数和 一样。反过来,它们很可能是用实函数计算的,包括 、 、 、 和 ,但细节不需要我们关心。cexp
clog
ln
sqrt
atan2
sin
cos
pow
ln −1 为 πi。但是,π不能以浮点格式表示。您的 Python 实现可能使用 IEEE-754“双精度”格式,也称为 binary64。在该格式中,最接近π的可表示值是 3.141592653589793115997963468544185161590576171875。因此,ln −1 可能计算为 3.141592653589793115997963468544185161590576171875 i。
那么 y ln x = .5 • 3.141592653589793115997963468544185161590576171875 i 是 1.5707963267948965579989817342720925807952880859375 i。
e1.5707963267948965579989817342720925807952880859375 我也不完全可表示。其真实值约为 6.123233995736765886130329661375001464640•10−17 + .9999999999999999999999999999999981253003 i。
与 6.123233995736765886130329661375001464640•10−17 最接近的可表示值为 6。 12323399573676603586882014729198302312846062338790031898128063403419218957424163818359375•10−17,最接近.9999999999999999999999999999999981253003的可表示值为1,因此计算结果为6.12323399573676603586882014729198302312846062338790031898128063403419218957424163818359375•10−17 + 1 i。
评论
printf
printf
%.25g
评论
(-1) ** 0.5
exp(log(-1) * .5)
exp(3.141592653589793115997963468544185161590576171875/2*i)