Python计算虚单位i= sqrt(-1)不准确:
>>> (-1) ** 0.5
(6.123233995736766e-17+1j)
应该恰好是1j
(Python将其称为j而不是i)。-1和0.5都被精确地表示,结果也可以被精确地表示,所以没有什么硬性理由(即浮点数限制)为什么Python不能正确地表示。它可以。而i=sqrt(-1)是的定义使得Python出错相当令人失望。为什么会这样呢?它是如何计算不准确的结果的?
当需要复杂的算术运算时,您的Python实现可能会计算xy为eylnx,就像复杂的C函数cexp
和clog
一样。这些又可能是用实际函数计算出来的,包括ln
,sqrt
,atan2
,sin
,cos
和pow
,但细节我们不需要关心。
ln−1是π。然而,π不能用浮点格式表示。您的Python实现可能使用IEEE-754"双精度"格式,也称为binary64。在这种格式中,与π最接近的值是3.141592653589793115997963468544185161590576171875。因此ln−1可能被计算为3.141592653589793115997963468544185161590576171875 i。
Thenylnx= .5•3.141592653589793115997963468544185161590576171875 i = 1.5707963267948965579989817342720925807952880859375 i.
e1.5707963267948965579989817342720925807952880859375 i也不是完全可表示的。它的真实值大约是6.123233995736765886130329661375001464640•10−17+ . 999999999999999999999999999999999999999981253003 i.
最近的可表示的值6.123233995736765886130329661375001464640×10<一口>−17> 17 一同晚餐,和最近的.9999999999999999999999999999999981253003可表示的值是1,所以计算结果是6.12323399573676603586882014729198302312846062338790031898128063403419218957424163818359375×10<一口>−17> /div>一口>一口>