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

dns, math, python, sqrt

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"

Problem

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`.

Original source

Related problems