2013-12-10 44 views
0

HI我正在運行一個簡單的程序,一個組件是使用二次公式的二次函數求解器。我使用cmath模塊的sqrt()方法來計算判別式的sqrt,即使判別式是正數,它仍然返回一個複數。儘管當我在tkinter標籤中顯示答案時,我使用%.3f作爲浮點數,但它表示它不會接受它,因爲它是一個複數。還有一個複數的佔位符嗎?python String Concatenation中的佔位符

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.') 

它返回複數如果爲1,B,C = 0,0 ...是否CMATH無論什麼返回複數?

熟悉python,雖然是複雜的數字,剛開始學習它們。

編輯: 我現在使用數學模塊和特殊情況負輸入,但是當我使用%.3f時,它不會允許我,因爲它很複雜。 (我做了負數的負數的sqrt以獲得積極的sqrt並乘以1j)是否有佔位符來做到這一點? (如%C 23) 感謝

回答

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任何小的值適合你的問題和浮點運算的固有缺陷。

0

有多種可能的解決方案。

首先,您可以使用math而不是cmath。它不會以任何明顯的方式對程序的性能產生不利影響。

否則,如果您知道數量是真實的,你可以用complex.realcmath.sqrt(2).real

0

是否CMATH無論什麼返回複數?

是。您需要正確打印複數,或使用常規的math.sqrt和特殊情況的負輸入。

+0

我現在正在使用數學模塊和特例負輸入,但是當我使用%.3f時,它不會允許我,因爲它很複雜。 (我做了負數的負數的sqrt以獲得積極的sqrt並乘以1j)是否有佔位符來做到這一點? (如%c) – user2658538

+0

@ user2658538:...所以,你建立了一個複雜的號碼嗎?這種做法違背了切換到非複雜數學模塊的目的。沒有複雜數字的格式說明符;您必須分別格式化「真實」和「圖像」組件。它看起來像你想John1024的答案。 – user2357112

+0

但cmath總是返回複雜的,我想顯示覆雜和真實的數字都取決於答案是什麼。如果有2個實數解或2個虛數數,我想顯示它們。 – user2658538