【问题标题】:ValueError: math domain error, keeps popping upValueError:数学域错误,不断弹出
【发布时间】:2017-01-04 05:33:55
【问题描述】:

我不时收到此消息。 我尝试了所有变体,改变了我使用 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 的值不形成三角形,例如a=2, b=4, c=10.

标签: python math


【解决方案1】:

正如其他人指出的那样,如果三个“边”实际上不形成三角形,则使用 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

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

【讨论】:

  • 非常感谢!这有帮助。
  • 不客气。然而,在这个网站上,通过投票所有有用的答案来表达你的感激之情。您可以通过单击答案左上角的向上箭头来做到这一点。此外,通过单击答案左上角附近的复选标记来接受最佳答案。这比在评论中说谢谢要好。它还可以帮助其他人看到您的问题已得到解答。所以请接受这个答案或另一个答案。两个都是很好的答案——如果你接受另一个,我不会难过的。
【解决方案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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2021-11-10
    • 2016-11-16
    相关资源
    最近更新 更多