0

嗨,我正在运行一个简单的程序,其中一个组件是使用二次公式的二次函数求解器。我正在使用 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??)谢谢

4

3 回答 3

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 替换为适合您的问题的任何小值以及浮点运算的固有斜率。

于 2013-12-10T03:57:12.143 回答
0

有多种可能的解决方案。

首先,您可以只使用math而不是cmath. 它不会以任何明显的方式对程序的性能产生不利影响。

否则,如果您知道该数字是真实的,则可以使用complex.realcmath.sqrt(2).real

于 2013-12-10T03:57:35.863 回答
0

cmath 无论如何都会返回复数?

是的。您需要正确打印复数,或者使用常规math.sqrt和特殊情况的负输入。

于 2013-12-10T03:58:05.597 回答