我正在尝试制作一个程序来检查tries
到max_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。谢谢你们
答案 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()调用返回错误。