2013-04-14 50 views
1

檢查出下面的代碼,當我輸入一個負數時,似乎沒有錯誤,但平方根不能是負數,所以我不知道爲什麼會發生這種情況。Math.sqrt上沒有錯誤(-1)

import math 
d=[] 
while True: 
    z=int(raw_input()) 
    if (z>0 and math.sqrt(z)): d.append(int(z)) 

在待機:

math.sqrt(int(-1)) 

Traceback (most recent call last): 
    File "<pyshell#16>", line 1, in <module> 
    math.sqrt(int(-1)) 
ValueError: math domain error 
+0

你問爲什麼第一個代碼示例不會像第二? – amccormack

+0

是啊,很多,林不知道爲什麼,不是在第一個代碼中的錯誤 –

回答

6
if (z>0 and math.sqrt(z)): ... 

Boolean operations short-circuit。這意味着如果z > 0爲假,則不評估math.sqrt(z)。因此沒有錯誤。

P.S.嚴格地說,負數的平方根存在,並且是complex。像scipy.sqrt()功能會愉快地返回了複雜的平方根之一:

>>> import scipy as sp 
>>> sp.sqrt(-1) 
1j 
+0

哇,我想這是一個很酷的功能。 –

+2

雖然平方根存在負數,但「平方根」沒有好的選擇。 「sqrt(-1)'評估爲'1j'是一個壞主意,因爲這樣你就失去了'sqrt'的某些有用的數學特性(例如乘法同態和連續性)。 – 2013-04-14 22:52:23

3

沒有錯誤,因爲你檢查,以確保該值爲正。 and運營商短路,這意味着如果第一個條件是錯誤的,第二個條件不評估。你寫了if z>0 and math.sqrt(z)。如果z小於或等於零,則不評估第二個表達式(平方根),因此您從不試圖取平方根,因此沒有錯誤。