6

I write this code for uri online judge(problem no.1036)...It is an Bhaskara's formula...

import cmath
A,B,C=input().split()
A = float(A)
B = float(B)
C = float(C)
D = (B*B)-(4*A*C)
if((D== -D)|(A==0)):
    print("Impossivel calcular")

else:
    T = cmath.sqrt(D)
    x1 = (-B+T)/(2*A)
    x2 = (-B-T)/(2*A)
    print("R1 = %.5f" %x1)
    print("R2 = %.5f" %x2)

but when i submit this program...that runtime error occured...

Traceback (most recent call last): File "Main.py", line 14, in
    print("R1 = %.5f" %x1)
TypeError: can't convert complex to float
Command exited with non-zero status (1)

please help me to solve this problem.

Rakibul Islam
  • 167
  • 1
  • 2
  • 14
  • 2
    Possible duplicate of [Formatting Complex Numbers](https://stackoverflow.com/questions/7746143/formatting-complex-numbers) – Mr. T Jun 20 '18 at 09:17

2 Answers2

3

The problem with using sqrt imported from cmath is that it outputs a complex number, which cannot be converted to float. If you are calculating a sqrt from positive number, use math library (see below).

>>> from cmath import sqrt
>>> sqrt(2)
(1.4142135623730951+0j)
>>> from math import sqrt
>>> sqrt(2)
1.4142135623730951
Tomasz Bartkowiak
  • 12,154
  • 4
  • 57
  • 62
2

the problem is just that your format string is for floats and not for complex numbers. something like this will work:

print('{:#.3} '.format(5.1234 + 4.123455j))
# (5.12+4.12j) 

or - more explicit:

print('{0.real:.3f} + {0.imag:.3f}i'.format(5.123456789 + 4.1234556547643j))
# 5.123 + 4.123i

you may want to have a look at the format specification mini language.

# as format specifier will not work with the old-style % formatting...

then there are more issues with your code:

if((D== -D)|(A==0)):

why not if D==0:? and for that it might be better to use cmath.isclose.

then: | is a bit-wise operator the way you use it; you may want to replace it with or.

your if statement could look like this:

if D == 0 or A == 0:
# or maybe
# if D.isclose(0) or A.isclose():
hiro protagonist
  • 44,693
  • 14
  • 86
  • 111