python:为啥将i计算为指数后float的零检测失败?

Posted

技术标签:

【中文标题】python:为啥将i计算为指数后float的零检测失败?【英文标题】:python: why does float's zero detection fail after calculating i as an exponent?python:为什么将i计算为指数后float的零检测失败? 【发布时间】:2016-05-24 00:35:29 【问题描述】:
0 == ((-1)**.5).real

... 在 python 3.5.1 中为 False,而:

0 == complex(0,1).real

... 是真的。这两种情况如何不同处理? float 类的零检测功能什么时候起作用,什么时候不起作用?

【问题讨论】:

(-1)**0.5 -> (6.123233995736766e-17+1j) 在我的机器上,我假设是因为floating point math 【参考方案1】:
>>> (-1)**0.5
(6.123233995736766e-17+1j)

仅此而已 - 由于浮点变幻莫测,计算结果的实部并不完全为零。但在你的另一种情况下是:

>>> complex(0,1).real
0.0

顺便说一句,** 调用了一个通用求幂例程,它在幕后添加了几层浮点舍入误差。如果你知道你想要一个平方根,最好使用平方根函数:

>>> import cmath
>>> cmath.sqrt(-1)
1j

【讨论】:

【参考方案2】:

计算分数幂 - 稍微简化 - r cis theta。由于 theta (pi) 不能精确地表示为二进制分数,因此结果不是 完全 您对手动计算的期望。您可以应用各种“在容差内相等”的函数来解决这个问题。

【讨论】:

以上是关于python:为啥将i计算为指数后float的零检测失败?的主要内容,如果未能解决你的问题,请参考以下文章

Python3实现计算BMI指数,跟我一起来计算你的BMI吧

小数末尾的零能去掉吗?为啥?

为啥我的输出值为指数格式 1.04e+05? [复制]

为啥 GOlang的float型后面要加32或64?

为啥我会收到 ValueError: could not convert string to float in Python? [复制]

浮点数