ValueError:使用math.sqrt()时的数学域错误

时间:2016-10-29 11:41:07

标签: python math

我正在尝试制作一个程序来检查triesmax_tries范围内的Herone Triangle,但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

我还是一个脚本小伙子,刚进入Python。谢谢你们

3 个答案:

答案 0 :(得分:1)

由于half_perimeter在循环外被初始化,因此它将始终具有值((1 * 3) + 3) / 2 = (3 + 3) / 2 = 6 / 2 = 3。然后,在循环内部,某些因素在某些情况下将变为负数,并且在其中一部分中,奇数个因子将变为负数。这会导致sqrt的整个论点变为否定,从而导致域错误,因为math.sqrt仅在结果为真时才起作用。

答案 1 :(得分:0)

在我看来,你并不真正理解for循环的工作方式。它执行所有代码&#39; inside&#39;它然后(在这种情况下)将{1}添加到tries

出于这个原因,在每次迭代中,你都会在tries中添加2 - 首先在你的代码中,然后是for循环iteslf就可以了。

我还认为你需要在每次迭代时再次计算half_perimeter - 否则它总是相同的并且你遇到数学错误(负数的平方根)。

答案 2 :(得分:0)

此等式在某一点给出负数 half_perimeter *(half_perimeter - tries)*(half_perimeter - tries - 1)*(half_perimeter - tries - 2)因此math.sqrt()调用返回错误。