user155876
user155876

Reputation: 361

Rounding cmath complex numbers?

I have instances in my code where two complex numbers (using the cmath module) that should be exactly the same, do not cancel out due to the floating point precision of the base 2 system causing the numbers to deviate from each other by a small difference in value at some nth decimal place.

If they were floating numbers of sufficient size, it would be a simple matter of just rounding them to a decimal place where the value difference no longer exists.

How could I do the same for the real and imaginary parts of complex numbers represented using the cmath module?

e.g. The following two complex numbers should be exactly the same, how could I implement some code to ensure that the real and imaginary components of some complex number are rounded to the nearest ith decimal place of my choice?

(0.6538461538461539-0.2692307692307693j)
(0.6538461538461539-0.26923076923076916j)

One possible solution, recommended by jonrsharpe:

if abs(a - b) < threshold:
    a = b

Upvotes: 1

Views: 1721

Answers (2)

RSW
RSW

Reputation: 1386

Numpy is defacto for numerical computing in python. Try np.round():

import numpy as np
x = 0.6538461538461539-0.2692307692307693j
print(np.round(x,decimals=3))
print(np.round(x,decimals=3)==np.round(x,decimals=3)) # True
print(np.round(x,decimals=3)==np.round(x,decimals=4)) # False

Upvotes: 0

Ohdelic
Ohdelic

Reputation: 11

"round" does not work directly on complex numbers, but it does work separately on the real resp. imaginary part of the number, e.g. rounding on 4 digits:

x = 0.6538461538461539-0.2692307692307693j
x_real = round(x.real, 4)
x_imag = round(x.imag, 4)
x = x_real + x_imag * 1j

Upvotes: 1

Related Questions