占位符在python String Concatenation中

时间:2013-12-10 03:49:24

标签: python complex-numbers cmath

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 ??) 感谢

3 个答案:

答案 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.realcmath.sqrt(2).real

答案 2 :(得分:0)

  

无论什么情况,cmath都会返回复数吗?

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