2015-03-31 89 views
2

是什么导致了这个问题?python数学域错误 - sqrt

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 
+0

检查是否总d *(DA)*(DB)的*(dc)是正数,因为sqrt(-1)是数学中的复数,但不是python – CY5 2015-03-31 18:39:06

+0

而且通常我们会问,当您发布“为什么会出现此错误?”时,还会包含导致该错误的输入。 – Teepeemm 2015-04-01 01:52:57

回答

2

的问题是,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" 
+0

谢谢你的回答,只是一个评论:我不能用'del'作为变量 – szzso24 2015-04-01 08:02:38

+0

噢。这是一个保留字。谢谢 – 2015-04-01 08:05:39

4

sqrt当您尝试使用负数时会出现该错误。 sqrt(-4)给出了该错误,因为结果是复杂数字

对于这一点,你需要cmath

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

我得到了同样的错误我的代码,直到我用cmath代替math像无水银说:

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)) 

这种方式运行正常我的代码。

+0

在另一个使用'cmath'而不是'math'的答案中已经提出了。 – MSeifert 2016-12-21 01:28:01

+0

我必须错过它。我不打算不给予适当的可信度,而且我也是新的[简介]来进行叠加。对于不高兴的倾向感到抱歉。 – SilverInternet 2016-12-21 03:38:14

0

使用CMATH代替..

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

现在无论数量是否negetive或正你会得到一个结果......

+0

OP正试图计算一个三角形的面积,似乎不太可能为一个不明确的三角形返回一个复数值是个好主意。 – 2018-02-18 17:34:14

+0

然后在输入值之前使用abs()来确保该值为正值.....然后使用math.sqrt().... – 2018-02-19 05:27:48

+0

这更糟!现在你默默地对问题给出了一个已知的错误答案,而不是给出任何错误的线索。如果有人询问边1,2和5的三角形的面积是多少,则正确的答案不是2.45j,而不是2.45。正确的答案是给消息“没有这样的三角形存在”的某种错误。 – 2018-02-19 08:36:03