我不时收到这条消息。 我尝试了所有的变化,改变了我使用sqrt的方式,一步一步地进行..等等 但是这个错误仍然不断涌现。 这可能是一个新手的错误,我没注意到,因为我是python和ubuntu的新手。 这是我的源代码:-(一个非常简单的程序)
#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
答案 0 :(得分:4)
正如其他人所指出的,如果三个“边”实际上不形成三角形,那么使用Heron公式计算面积将涉及负数的平方根。一个答案显示了如何处理异常处理。然而,这并没有发现三个“边”形成退化三角形的情况,一个面积为零,因此不是传统的三角形。一个例子是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
如果要允许退化三角形,请删除支票中的等号。
答案 1 :(得分:2)
如果a,b,c不形成三角形,则sq将为-ve。
检查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"