2016-08-27 3 views
0

Я продолжаю получать это сообщение время от времени. Я пробовал все варианты, меняя способ использования sqrt, делая это шаг за шагом ..etc Но все же эта ошибка продолжает появляться. Это может быть ошибка новобранец, которую я не замечаю, так как я новичок в python и ubuntu. Это мой исходный код :-(очень простая программа)ValueError: ошибка в области математики, продолжает появляться

#To find the area of a triangle 
a=input("Input the side 'a' of a triangle ") 
b=input("Input the side 'b' of a trianlge ") 
c=input("Input the side 'c' of a triangle ") 
from math import * 
s=(a+b+c)/2 
sq=(s*(s-a)*(s-b)*(s-c)) 
area=(sqrt(sq)) 
perimeter=2*(a+b) 
print "Area = ", area 
print "perimeter=", perimeter 

и это ошибка я получаю

Traceback (most recent call last): 

    line 8, in <module> 

    area=(sqrt(sq)) 

ValueError: math domain error 
+1

Это произойдет, если значения для 'a',' b' и 'c' не образуют треугольник, например. 'a = 2, b = 4, c = 10'. – user3386109

ответ

3

Как уже отмечалось, ваш расчет площади по формуле Герона будет включать квадратный корень из отрицательного числа, если три «стороны» фактически не образуют треугольник. Один ответ показал, как справиться с обработкой исключений. Однако это не улавливает случай, когда три «стороны» образуют вырожденный треугольник, один с нулевой областью и, следовательно, не является традиционным треугольником. Примером этого может быть a=1, b=2, c=3. Исключение также ждет, пока вы не попробуете расчет, чтобы найти проблему. Другим подходом является проверка значений перед вычислениями, которые немедленно обнаружат проблему и позволяют решить, принимать или не принимать вырожденный треугольник. Вот один из способов проверить:

a=input("Input the side 'a' of a triangle ") 
b=input("Input the side 'b' of a triangle ") 
c=input("Input the side 'c' of a triangle ") 
if a + b <= c or b + c <= a or c + a <= b: 
    print('Those values do not form a triangle.') 
else: 
    # calculate 

Вот еще один чек, только два неравенства, а не традиционные три:

if min(a,b,c) <= 0 or sum(a,b,c) <= 2*max(a,b,c): 
    print('Those values do not form a triangle.') 
else: 
    # calculate 

Если вы хотите, чтобы вырожденные треугольники, удалите знак равенства в чеки.

+0

Thanx много! Это помогло. – steve

+0

Добро пожаловать. Однако, на этом сайте, продемонстрируйте свою благодарность, положив все полезные ответы. Вы делаете это, нажимая стрелку вверх в левом верхнем углу ответа. Кроме того, примите наилучший ответ, щелкнув галочку в левом верхнем углу ответа. Это лучше, чем сказать спасибо в комментарии. Это также помогает другим понять, что на ваш вопрос был дан ответ. Поэтому, пожалуйста, примите либо этот ответ, либо другой. Оба - хорошие ответы - я не буду плохо себя чувствовать, если вы примете другой. –

2

Если а, Ь, с не образует треугольник, кв выйдет, будет. Проверьте, является ли s*(s-a)*(s-b)*(s-c) положительным, так как sqrt (-ve number) является комплексным числом.

Для решения этой проблемы вы можете использовать обработку исключений.

try: 
    a=input("Input the side 'a' of a triangle ") 
    b=input("Input the side 'b' of a trianlge ") 
    c=input("Input the side 'c' of a triangle ") 
    from math import * 
    s=(a+b+c)/2 
    sq=(s*(s-a)*(s-b)*(s-c)) 
    area=(sqrt(sq)) 
    perimeter=2*(a+b) 
    print "Area = ", area 
    print "perimeter=", perimeter 
except ValueError: 
    print "Invalid sides of a triangle" 
Смежные вопросы