2016-10-29 48 views
0

我試圖做一個計劃範圍內檢查Herone三角爲triesmax_triesmath.sqrt()是讓我頭疼ValueError異常:數學域錯誤使用math.sqrt()時

這是我的代碼

import math 
max_tries = 10000 
tries = 1 
half_perimeter = ((tries * 3) + 3)/2 

for num in range(tries,max_try,1): 
    area = math.sqrt(half_perimeter * (half_perimeter - tries) * (half_perimeter - tries - 1) * (half_perimeter - tries - 2)) 
    if isinstance(area, int) == True: 
     print (tries) 
     tries = tries + 1 
    else : 
     tries = tries + 1 

每當我運行,我從Python獲得ValueError: math domain error。我的代碼有什麼問題?整個錯誤返回是

Traceback (most recent call last): 
File "C:\Users\phong\AppData\Local\Programs\Python\Python35\Herone Triangle.py", line 9, in <module> 
area = math.sqrt(half_perimeter * (half_perimeter - tries) * (half_perimeter - tries - 1) * (half_perimeter - tries - 2)) 
ValueError: math domain error 

我還是一個腳本kiddy,剛剛進入Python。謝謝你們

+0

你正在取一個負數的平方根。 –

+0

您的代碼沒有定義變量'max_try',這使得我們更難以運行您的代碼或找到確切的問題。請參見[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

回答

0

在我看來,你並不真正瞭解for循環的工作方式。它執行所有代碼「內部」,然後(在這種情況下)添加一個到tries

由於這個原因,在每次迭代中,您都要先在代碼中添加2到tries - 然後在for循環中執行它。

我也相信你需要再次計數half_perimeter每次迭代 - 否則它總是相同的,你會遇到數學錯誤(負數的平方根)。

1

由於half_perimeter在循環外初始化,它將始終具有值((1 * 3) + 3)/2 = (3 + 3)/2 = 6/2 = 3。然後,在循環內部,某些因素在某些情況下會變爲負值,並且在其中的一部分因素中,奇數個因素將變爲負值。這導致sqrt的整個參數變爲負值,這導致域錯誤,因爲math.sqrt僅在結果爲真時才起作用。

+0

這應該是主要的錯誤。將'half_perimeter'的評估放入循環中,至少Heron公式是正確的。 – LutzL

0

該方程在某些時候給出負數half_perimeter *(half_perimeter - 嘗試)*(half_perimeter - 嘗試 - 1)*(half_perimeter - 嘗試 - 2)從而math.sqrt()調用將返回錯誤。

相關問題