I am learning how to use Python 3 for scientific computing. In an exercise, I am asked to implement a function that returns the real or complex roots of a quadratic equation, as well as implementing a test function to verify the accuracy of my function. I am having troubles comparing two floats values.
Here is my function:
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
Here is my 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()
The problem is when I compare the computed solutions with their respective exact solutions.
If I run roots(5,6,1)
, I get (-0.20000000000000001, -1.0)
With a threshold of 1E-14
, there is no problem (as expected). However, if I change it to something much smaller (e.g. 1E-25
), I don't get an error when I should, no? I was wondering what is happening, and I would greatly appreciate the community's feedback.
Thank you!
EDIT:
Also, how could I use the same logic but compare two complex numbers? I never work with them.