Python ValueError:数学域错误,不断弹出

Python ValueError:数学域错误,不断弹出,python,math,Python,Math,我不时收到这个消息。 我尝试了所有的变化,改变了我使用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("

我不时收到这个消息。 我尝试了所有的变化,改变了我使用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

如果a,b,c不形成三角形,sq将变成-ve。 检查s*s-a*s-b*s-c是否为正数,因为sqrt ve号是复数

要解决此问题,可以使用异常处理

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"

正如其他人所指出的,如果三条边实际上没有形成三角形,那么使用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

如果要允许退化三角形,请删除检查中的等号。

如果a、b和c的值不形成三角形,则会出现这种情况,例如a=2、b=4、c=10.x很多!这很有帮助,不客气。然而,在这个网站上,通过投票选出所有有用的答案来表达你的感激之情。您可以通过单击答案左上角的向上箭头来完成此操作。此外,单击答案左上角附近的复选标记接受最佳答案。这比在评论中说谢谢要好。这也有助于其他人看到你的问题得到了回答。所以,请接受这个或另一个答案。这两个都是很好的答案——如果你接受另一个,我不会感到不安。