9

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.

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
szzso24
  • 93
  • 1
  • 1
  • 3
  • Check whether total of d*(d-a)*(d-b)*(d-c) is positive because sqrt(-1) is complex number in math but not in python – CY5 Mar 31 '15 at 18:39
  • And generally, we ask that when you post "why am I getting this error?", you also include the input that causes that error. – Teepeemm Apr 01 '15 at 01:52

4 Answers4

8

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"
Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
7

sqrt gives that error when you try to use it with a negative number. sqrt(-4) gives that error because the result is a complex number.

For that, you need cmath:

>>> from cmath import sqrt
>>> sqrt(-4)
2j
>>> sqrt(4)
(2+0j)
aneroid
  • 12,983
  • 3
  • 36
  • 66
2

I got the same error with my code until I used cmath instead of math like aneroid said:

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

This way ran my code properly.

aneroid
  • 12,983
  • 3
  • 36
  • 66
  • It was already proposed in another answer to use `cmath` instead of `math`. – MSeifert Dec 21 '16 at 01:28
  • 2
    I must of missed it. I had no intention of not giving proper credibility, and I am also new [profile wise] to stackoverflow. Sorry for the noobish tendencies. – SilverInternet Dec 21 '16 at 03:38
1

Use cmath instead..

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

Now regardless of whether the number is negetive or positive you will get a result...

Subham Debnath
  • 689
  • 8
  • 9
  • 1
    The OP is trying to calculate the area of a triangle, it seems unlikely that returning a complex value for an ill-specified triangle is a good idea. – Mark Dickinson Feb 18 '18 at 17:34
  • Then before entering the value use abs() to make sure the value is positive.....Then use math.sqrt().... – Subham Debnath Feb 19 '18 at 05:27
  • 2
    That's even worse! Now you're silently giving a known wrong answer to the problem, instead of giving any clue that something's wrong. If someone asks what the area of a triangle with sides 1, 2 and 5 is, the correct answer isn't 2.45j, and it's not 2.45. The correct answer is to give some kind of error with a message "No such triangle exists." – Mark Dickinson Feb 19 '18 at 08:36
  • Hmmmmm.....Then first of all we need to check that the sides satisfy pythagorean theorem then proceed... – Subham Debnath Feb 20 '18 at 05:34