ошибка математического домена 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

person szzso24    schedule 31.03.2015    source источник
comment
Проверьте, является ли сумма d * (d-a) * (d-b) * (d-c) положительной, потому что sqrt (-1) является комплексным числом в математике, но не в python   -  person CY5    schedule 31.03.2015
comment
И обычно мы просим, ​​чтобы, когда вы публикуете, почему я получаю эту ошибку?, вы также включали ввод, который вызывает эту ошибку.   -  person Teepeemm    schedule 01.04.2015


Ответы (4)


Проблема в том, что формула Герона работает только тогда, когда сумма двух чисел больше чем третий. Вы должны проверить это явно.

Лучший способ сделать это с помощью кода — использовать обработку исключений.

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"
person Bhargav Rao    schedule 31.03.2015
comment
Спасибо за ответ, просто комментарий: я не могу использовать «del» в качестве переменной. - person szzso24; 01.04.2015
comment
Ах, да. Это зарезервированное слово. Спасибо - person Bhargav Rao; 01.04.2015

sqrt выдает эту ошибку, когда вы пытаетесь использовать ее с отрицательным числом. sqrt(-4) выдает эту ошибку, потому что результатом является комплексное число.

Для этого вам нужно cmath:

>>> from cmath import sqrt
>>> sqrt(-4)
2j
>>> sqrt(4)
(2+0j)
person aneroid    schedule 31.03.2015

Я получил ту же ошибку с моим кодом, пока не использовал 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) )

Таким образом, мой код работал правильно.

person SilverInternet    schedule 21.12.2016
comment
В другом ответе уже предлагалось использовать cmath вместо math. - person MSeifert; 21.12.2016
comment
Должно быть, я пропустил это. У меня не было намерения не вызывать должного доверия, и я также новичок [по профилю] в stackoverflow. Извините за нубские наклонности. - person SilverInternet; 21.12.2016

Вместо этого используйте cmath.

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

Теперь независимо от того, является ли число отрицательным или положительным, вы получите результат...

person Subham Debnath    schedule 18.02.2018
comment
ОП пытается вычислить площадь треугольника, маловероятно, что возврат сложного значения для неправильно указанного треугольника является хорошей идеей. - person Mark Dickinson; 18.02.2018
comment
Затем, прежде чем вводить значение, используйте abs(), чтобы убедиться, что значение положительное..... Затем используйте math.sqrt().... - person Subham Debnath; 19.02.2018
comment
Это еще хуже! Теперь вы молча даете заведомо неправильный ответ на проблему вместо того, чтобы намекнуть, что что-то не так. Если кто-то спросит, какова площадь треугольника со сторонами 1, 2 и 5, правильный ответ будет не 2,45j и не 2,45. Правильный ответ — выдать какую-то ошибку с сообщением, что такого треугольника не существует. - person Mark Dickinson; 19.02.2018
comment
Хммммм..... Тогда, прежде всего, нам нужно проверить, что стороны удовлетворяют теореме Пифагора, а затем продолжить... - person Subham Debnath; 20.02.2018