HI我正在运行一个简单的程序,一个组件是使用二次公式的二次函数求解器。我正在使用cmath模块sqrt()方法计算判别式的sqrt,即使判别式为正,它仍然返回一个复数。虽然当我在tkinter标签中显示答案时,我使用%.3f作为浮点数,但它表示不会接受它,因为它是一个复数。是否还有一个复杂的数字占位符?
def quad(a,b,c):
global answers
print a,b,c
disc=b**2
ac4=4*a*c
disc-=ac4
sdisc=sqrt(disc)
b*=-1
a2=a*2
answer=[]
print a
if a!=0:
ans1=(b+sdisc)/a2
ans2=(b-sdisc)/a2
if ans1==ans2:
answer.append(ans1)
print type(ans1)
answers.config(text='%.3f' %ans1)
else:
answer.append(ans1)
answer.append(ans2)
answers.config(text='%.3f , %.3f' %(ans1,ans2))
elif a==0:
answers.config(text='Not a Quadratic Function.')
如果a为1且b,c = 0,0,则返回复数...无论什么情况,cmath都会返回复数吗?
熟悉python虽然是复杂数字的新手,但刚开始学习它们。
编辑: 我现在正在使用数学模块和特殊情况下的负输入,但是当我使用%.3f时它不允许我这样做,因为它很复杂。 (我做了负数的负数的sqrt得到正的sqrt并乘以1j)是否有占位符来做这个? (比如%c ??) 感谢
答案 0 :(得分:0)
r = cmath.sqrt(1)
print('%f+i%f' % (r.real, r.imag))
如果您希望该数字是真实的,您可以测试并转换它:
if abs(r.imag) < 1e-9:
r = r.real
else:
print('Surprise: got a nonzero imaginary part!')
你应该将1e-9替换为适合你的问题和浮点运算固有斜率的任何小值。
答案 1 :(得分:0)
有多种可能的解决方案。
首先,您可以使用math
代替cmath
。它不会以任何明显的方式对程序的性能产生负面影响。
否则,如果您知道该号码是真实的,您可以使用complex.real
:cmath.sqrt(2).real
答案 2 :(得分:0)
无论什么情况,cmath都会返回复数吗?
是。您需要正确打印复数,或使用常规math.sqrt
和特殊情况的负输入。