Найти - Пользователи
Полная версия: Корень третьей степени из отрицательного числа.
Начало » Python для экспертов » Корень третьей степени из отрицательного числа.
1
Cyxapeff
Каким образом можно извлечь сабж? math.pow(x,1.0/3) выдаёт ошибку: ValueError: math domain error…
slivlen
Можно было и без math обойтись( x**(1.0/3)). Правда тоже с отрецательными числами не работает. ;)
Я думаю так должно работать:
x=complex(-8)
res=abs(x**(1.0/3))
koder
rt3 = lambda x : (abs(x) ** ( 1.0 / 3 )) * (1,-1)
koder
P.S. кстати ( x**(1.0/3)) работать не может т.к. ето возведение отрицательного
числа в нецелую степень )). А о том что это 1/3 никакая мат. библиотека не догадается
slivlen
koder
rt3 = lambda x : (abs(x) ** ( 1.0 / 3 )) * (1,-1)
А не проще сделать тогда так: lambda x:abs(complex(x)**(1.0/3)) ?
koder
slivlen
….А не проще сделать тогда так: lambda x:abs(complex(x)**(1.0/3)) ?
При етом теряется знак : abs(complex(-8)**(1.0/3)) == 2.0
Да и не люблю я комплексную арифметику там где без нее можно обойтись -
лишние накладные расходы и многие тулзы типа psyco
не очень хорошо ее переваривают
slivlen
Точно, я чо-то совсем на знак забил ;)

Получается решение проблемы в общем виде будет типа такого:
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
elif x > 0: return x**( 1.0 / power )
заменить на
elif x >= 0: return x**( 1.0 / power )
а то root(0,2) по исключению вылетать будет
slivlen
Патч принят ;)

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
Я, как не первый год в математике, могу сказать, что отрицательные числа нельзя возводить в нецелую степень. Есть несколько вариантов:
1. Использовать комплексную арифетику (но могут быть проблемы, что корень третей степени будет иметь три различных корня)
2. Если степень четко задана целыми степенями и корнями (дроби могут быть заданы несколькими вариантами), то заранее расчитать знак и возводить модуль числа
3. Если это будет какой-нить калькулятор, то просто выдать ошибку.

Кстати а зачем может это понадобиться?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB