2016-10-29 20 views
0

私はmax_triestriesのための範囲でHeroneトライアングルをチェックするプログラムを作成しようとしているが、math.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 

実行するたびに、私はValueError: math domain errorをpythonから入手します。私のコードで何が間違っていますか?返されるエラー全体は

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

負の数の平方根をとっています。 –

+0

あなたのコードでは変数 'max_try'が定義されていないため、コードを実行したり正確な問題を見つけることが難しくなります。 [最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve)を参照してください。 –

答えて

0

あなたは実際にはforループが動作する方法を理解していないようです。それはそれの中のすべてのコードを実行し、次にこの場合はtriesに1を加えます。

この理由から、それぞれの反復で2をtriesに追加してください。最初はコードに入れてからforループiteslfを実行します。

また、繰り返しごとに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()呼び出しがエラーを返しています。

関連する問題