Форум сайта python.su
Каким образом можно извлечь сабж? math.pow(x,1.0/3) выдаёт ошибку: ValueError: math domain error…
Офлайн
Можно было и без math обойтись( x**(1.0/3)). Правда тоже с отрецательными числами не работает. ;)
Я думаю так должно работать:
x=complex(-8) res=abs(x**(1.0/3))
Офлайн
rt3 = lambda x : (abs(x) ** ( 1.0 / 3 )) * (1,-1)
Отредактировано (Сен. 29, 2006 12:04:03)
Офлайн
P.S. кстати ( x**(1.0/3)) работать не может т.к. ето возведение отрицательного
числа в нецелую степень )). А о том что это 1/3 никакая мат. библиотека не догадается
Офлайн
koderА не проще сделать тогда так: lambda x:abs(complex(x)**(1.0/3)) ?
rt3 = lambda x : (abs(x) ** ( 1.0 / 3 )) * (1,-1)
Офлайн
slivlenПри етом теряется знак : abs(complex(-8)**(1.0/3)) == 2.0
….А не проще сделать тогда так: lambda x:abs(complex(x)**(1.0/3)) ?
Офлайн
Точно, я чо-то совсем на знак забил ;)
Получается решение проблемы в общем виде будет типа такого:
def root(x, power): if power % 2: return (abs(x) ** ( 1.0 / power )) * (1,-1)[x < 0] elif x > 0: return x**( 1.0 / power ) else: raise ValueError("Oh, shit!!!")
Офлайн
elif x > 0: return x**( 1.0 / power )
заменить на
elif x >= 0: return x**( 1.0 / power )
а то root(0,2) по исключению вылетать будет
Отредактировано (Сен. 29, 2006 16:07:41)
Офлайн
Патч принят ;)
def root(x, power): if power % 2: return (abs(x) ** ( 1.0 / power )) * (1,-1)[x < 0] elif x >= 0: return x**( 1.0 / power ) else: raise ValueError("Oh, shit!!!")
Офлайн
Я, как не первый год в математике, могу сказать, что отрицательные числа нельзя возводить в нецелую степень. Есть несколько вариантов:
1. Использовать комплексную арифетику (но могут быть проблемы, что корень третей степени будет иметь три различных корня)
2. Если степень четко задана целыми степенями и корнями (дроби могут быть заданы несколькими вариантами), то заранее расчитать знак и возводить модуль числа
3. Если это будет какой-нить калькулятор, то просто выдать ошибку.
Кстати а зачем может это понадобиться?
Офлайн