【问题标题】:python math domain error - sqrtpython数学域错误-sqrt
【发布时间】:2015-06-05 05:24:15
【问题描述】:

是什么导致了问题?

from math import sqrt
print "a : "
a = float(raw_input())
print "b : "
b = float(raw_input())
print "c : "
c = float(raw_input())
d = (a + b + c)/2
s = sqrt(d*(d-a)*(d-b)*(d-c))
print "a+b+c =", a, b, c
print "Distr. =", d*2, "Area =", s

错误:

Traceback (most recent call last):
   File "C:/Python27/fájlok/háromszög terület2.py", line 11, in <module>
       s = sqrt(d*(d-a)*(d-b)*(d-c))
ValueError: math domain error

【问题讨论】:

  • 检查 d*(d-a)*(d-b)*(d-c) 的总和是否为正,因为 sqrt(-1) 在数学中是复数,但在 python 中不是
  • 一般情况下,我们会要求您在发布“为什么我收到此错误?”时,还包括导致该错误的输入。

标签: python math dns sqrt


【解决方案1】:

问题是Heron's formula 只有当两个数字的总和大于第三个时才成立。您需要明确检查。

使用代码执行此操作的更好方法是使用异常处理

try:
    s = sqrt(d*(d-a)*(d-b)*(d-c))
    print "a+b+c =", a, b, c
    print "Distr. =", d*2, "Area =", s
except ValueError:
    print "Please enter 3 valid sides"

如果你想在没有 try 块的情况下这样做,你可以这样做

delta = (d*(d-a)*(d-b)*(d-c))
if delta>0:
    s = sqrt(delta)
    print "a+b+c =", a, b, c
    print "Distr. =", d*2, "Area =", s
else:
    print "Please enter 3 valid sides"

【讨论】:

  • 谢谢你的回答,只是一个评论:我不能使用使用'del'作为变量
  • 哦,是的。它是一个保留字。谢谢
【解决方案2】:

sqrt 当您尝试将其与负数一起使用时会出现该错误。 sqrt(-4) 给出了这个错误,因为结果是一个复数。

为此,您需要cmath:

>>> from cmath import sqrt
>>> sqrt(-4)
2j
>>> sqrt(4)
(2+0j)

【讨论】:

    【解决方案3】:

    在我使用 cmath 而不是 math 之前,我的代码出现了同样的错误,就像 aneroid 说的那样:

    import sys
    import random
    import cmath
    
    x = random.randint(1, 100)
    y = random.randint(1, 100)
    
    a = 2 * x * cmath.sqrt(1 - x * 2 - y * 2)
    b = 2 * cmath.sqrt(1 - x * 2 - y * 2)
    c = 1 - 2 * (x * 2 + y * 2)
    
    print ( 'The point on the sphere is: ', (a, b, c) )
    

    这种方式可以正确运行我的代码。

    【讨论】:

    • 已经在另一个答案中提出使用cmath而不是math。
    • 我一定错过了。我无意不给予适当的可信度,而且我也是 stackoverflow 的新手 [profile wise]。很抱歉有noobish 的倾向。
    【解决方案4】:

    改用 cmath..

    import cmath
    num=cmath.sqrt(your_number)
    print(num)
    

    现在无论数字是负数还是正数,您都会得到结果...

    【讨论】:

    • OP 正在尝试计算三角形的面积,对于指定不正确的三角形返回复数值似乎不太可能是个好主意。
    • 然后在输入值之前使用 abs() 确保值是正数.....然后使用 math.sqrt()....
    • 那更糟!现在你默默地给出了一个已知的错误答案,而不是给出任何错误的线索。如果有人问边 1、2 和 5 的三角形的面积是多少,正确答案不是 2.45j,也不是 2.45。正确的答案是给出某种错误消息“不存在这样的三角形”。
    • Hmmmmm.....那么首先我们需要检查边是否满足勾股定理然后继续......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2011-06-11
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多