pythonmathdnssqrt

Why does math.sqrt result in ValueError: math domain error?


What causes the problem?

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)

Error:

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

See also: Why does math.log result in ValueError: math domain error? for the equivalent problem using math.log; Python math domain error using math.acos function for the equivalent problem using math.acos.


Solution

  • The problem is that the Heron's formula holds good only when the sum of the two numbers are greater than the third. You need to check that explicitly.

    A better way as you are using a code to do that is by using Exception handling

    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"
    

    If you want to do it without try block you can do it as

    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"