Python 确定两个复数是否相等

Python 确定两个复数是否相等,python,numpy,Python,Numpy,以下代码导致执行打印语句: import numpy as np import math foo = np.array([1/math.sqrt(2), 1/math.sqrt(2)], dtype=np.complex_) total = complex(0, 0) one = complex(1, 0) for f in foo: total = total + pow(np.abs(f), 2) if(total != one): print str(total

以下代码导致执行打印语句:

import numpy as np
import math

foo = np.array([1/math.sqrt(2), 1/math.sqrt(2)], dtype=np.complex_)

total = complex(0, 0)
one = complex(1, 0)
for f in foo:
   total = total + pow(np.abs(f), 2)
   if(total != one):
      print str(total) + " vs " + str(one)
      print "NOT EQUAL"
但是,我输入的
[1/math.sqrt(2),1/math.sqrt(2)]
结果是
总数为
1

(1+0j) vs (1+0j) NOT EQUAL

这与将NumPy与Python的复杂类型混合有关吗?

我想,对于实数,同样的考虑也适用:永远不要假设它们可以相等,而是足够接近:

eps = 0.000001
if abs(a - b) < eps:
    print "Equal"
eps=0.000001
如果abs(a-b)
我想,对于实数,同样的考虑也是适用的:永远不要假设它们可以相等,而应该足够接近:

eps = 0.000001
if abs(a - b) < eps:
    print "Equal"
eps=0.000001
如果abs(a-b)
使用浮点数时,请务必记住,使用这些数字永远不会精确,因此每次计算都会出现舍入错误。这是由计算机的设计造成的,也是目前在资源有限的计算机上进行高任意精度数学的最可行的方法。您无法使用浮点进行精确计算(这意味着您几乎别无选择),因为您的数字必须在某个地方截断,以适应合理的内存量(在大多数情况下,最大为64位),这种截断是通过四舍五入完成的(见下面的示例)

为了正确处理这些缺点,你永远不应该为了平等而与浮动相比较,而是为了接近。Numpy为此提供了两个函数:单个值的比较(或数组的逐项比较)和整个数组。后者是一个
np.all(np.isclose(a,b))
,因此可以为数组获取一个值

>>> np.isclose(np.float32('1.000001'), np.float32('0.999999'))
True
但有时四舍五入是非常可行的,符合我们的期望,例如:

>>> np.float(1) == np.square(np.sqrt(1))
True
平方后,值的大小将减小,以适合给定的内存,因此在这种情况下,它将四舍五入到我们期望的大小

这两个函数具有内置的绝对和相对公差(也可以作为参数提供),用于比较两个值。默认情况下,它们是
rtol=1e-05
atol=1e-08


另外,不要将不同的包与它们的类型混合。如果使用Numpy,请使用Numpy类型和Numpy函数。这也将减少舍入误差


顺便说一句:当使用指数差异很大的数字时,舍入误差的影响更大。

使用浮点数时,重要的是要记住,使用这些数字永远不会精确,因此每次计算都会受到舍入误差的影响。这是由计算机的设计造成的,也是目前在资源有限的计算机上进行高任意精度数学的最可行的方法。您无法使用浮点进行精确计算(这意味着您几乎别无选择),因为您的数字必须在某个地方截断,以适应合理的内存量(在大多数情况下,最大为64位),这种截断是通过四舍五入完成的(见下面的示例)

为了正确处理这些缺点,你永远不应该为了平等而与浮动相比较,而是为了接近。Numpy为此提供了两个函数:单个值的比较(或数组的逐项比较)和整个数组。后者是一个
np.all(np.isclose(a,b))
,因此可以为数组获取一个值

>>> np.isclose(np.float32('1.000001'), np.float32('0.999999'))
True
但有时四舍五入是非常可行的,符合我们的期望,例如:

>>> np.float(1) == np.square(np.sqrt(1))
True
平方后,值的大小将减小,以适合给定的内存,因此在这种情况下,它将四舍五入到我们期望的大小

这两个函数具有内置的绝对和相对公差(也可以作为参数提供),用于比较两个值。默认情况下,它们是
rtol=1e-05
atol=1e-08


另外,不要将不同的包与它们的类型混合。如果使用Numpy,请使用Numpy类型和Numpy函数。这也将减少舍入误差


顺便说一句:在处理指数差异很大的数字时,舍入误差的影响更大。

尝试
repr(total)
而不是
str(total)
这很可能是比较浮点数的问题,因为复数类型只是两个浮点数的组合。检查一下这个小指南:关于如何比较浮点数。类似地,尝试
2==sqrt(2)*sqrt(2)
…尝试
repr(total)
而不是
str(total)
这很可能是比较浮点数的问题,因为复杂类型只是两个浮点数的组合。检查一下这个小指南:关于如何比较浮点数。类似地,尝试
2==sqrt(2)*sqrt(2)
…您也可以使用
np.isclose
或数组
np.allclose
从不假设,但有时可能知道。只要你知道哪里会出现错误,浮动相等就不是坏事。例如,浮点在积分上精确到2**53 IIRC。您也可以使用
np.isclose
或数组
np.allclose
从不假设,但有时可能知道。只要你知道哪里会出现错误,浮动相等就不是坏事。例如,浮点数在积分上是精确的,最高可达2**53 IIRC。正如我回答bereal时所说,重要的是要注意浮点数是精确的;只是有些浮点运算不是。例如,
16.0**0.5
将始终给出
4.0
的准确答案,但类似
10**0.5
的内容显然必须四舍五入。通常(但不总是),如果输入和输出是精确的,那么计算将是精确的。是的,谢谢。数字总是精确的,操作必须对数字进行四舍五入,因此不准确。我在回答中澄清了这一点。@Veedrac Well
10**0.5
有点明显,因为这个数字是无理的。作为