Cyxapeff
Сен. 27, 2006 19:47:06
Каким образом можно извлечь сабж? math.pow(x,1.0/3) выдаёт ошибку: ValueError: math domain error…
slivlen
Сен. 28, 2006 12:58:45
Можно было и без math обойтись( x**(1.0/3)). Правда тоже с отрецательными числами не работает. ;)
Я думаю так должно работать:
x=complex(-8)
res=abs(x**(1.0/3))
koder
Сен. 29, 2006 12:00:49
rt3 = lambda x : (abs(x) ** ( 1.0 / 3 )) * (1,-1)
koder
Сен. 29, 2006 12:03:13
P.S. кстати ( x**(1.0/3)) работать не может т.к. ето возведение отрицательного
числа в нецелую степень )). А о том что это 1/3 никакая мат. библиотека не догадается
slivlen
Сен. 29, 2006 12:11:29
koder
rt3 = lambda x : (abs(x) ** ( 1.0 / 3 )) * (1,-1)
А не проще сделать тогда так: lambda x:abs(complex(x)**(1.0/3)) ?
koder
Сен. 29, 2006 12:38:33
slivlen
….А не проще сделать тогда так: lambda x:abs(complex(x)**(1.0/3)) ?
При етом теряется знак : abs(complex(-8)**(1.0/3)) == 2.0
Да и не люблю я комплексную арифметику там где без нее можно обойтись -
лишние накладные расходы и многие тулзы типа psyco
не очень хорошо ее переваривают
slivlen
Сен. 29, 2006 13:30:34
Точно, я чо-то совсем на знак забил ;)
Получается решение проблемы в общем виде будет типа такого:
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!!!")
koder
Сен. 29, 2006 15:44:18
elif x > 0: return x**( 1.0 / power )
заменить на
elif x >= 0: return x**( 1.0 / power )
а то root(0,2) по исключению вылетать будет
slivlen
Сен. 29, 2006 16:30:44
Патч принят ;)
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!!!")
albert
Окт. 2, 2006 12:52:17
Я, как не первый год в математике, могу сказать, что отрицательные числа нельзя возводить в нецелую степень. Есть несколько вариантов:
1. Использовать комплексную арифетику (но могут быть проблемы, что корень третей степени будет иметь три различных корня)
2. Если степень четко задана целыми степенями и корнями (дроби могут быть заданы несколькими вариантами), то заранее расчитать знак и возводить модуль числа
3. Если это будет какой-нить калькулятор, то просто выдать ошибку.
Кстати а зачем может это понадобиться?