我正在学习如何将Python 3用于科学计算。在练习中,我被要求实现一个返回二次方程的实数或复数根的函数,以及实现一个测试函数来验证函数的准确性。我在比较两个浮点值时遇到了麻烦。
这是我的功能:
def roots(a, b, c):
from numpy.lib.scimath import sqrt #Handles real and complex numbers
r = sqrt(b**2 - 4*a*c)
sol_1 = (-b + r)/(2*a)
sol_2 = (-b - r)/(2*a)
return sol_1, sol_2
这是我的test_function:
def test_roots_real():
a = 5; b = 6; c = 1 #test parameters (roots should be -0.2(+) and -1(-)
exact_sol_1 = -0.2
exact_sol_2 = -1
sol_1, sol_2 = roots(a,b,c)
success = (abs(exact_sol_1 - sol_1) < 1E-14) and (abs(exact_sol_2 - sol_2) < 1E-14) #Never use == with floats!
msg = 'Cannot find accurate solutions'
assert success, msg
test_roots_real()
问题在于我将计算出的解与其各自的精确解进行比较。
如果我运行roots(5,6,1)
,我会获得(-0.20000000000000001, -1.0)
阈值为1E-14
,没有问题(如预期的那样)。但是,如果我将其更改为更小的东西(例如1E-25
),我应该不会出现错误,不是吗?我想知道发生了什么,我非常感谢社区的反馈。
谢谢!
编辑:
另外,我怎么能使用相同的逻辑但比较两个复数?我从不与他们合作。