Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2006 19:47:06

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

Каким образом можно извлечь сабж? math.pow(x,1.0/3) выдаёт ошибку: ValueError: math domain error…



Офлайн

#2 Сен. 28, 2006 12:58:45

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

Можно было и без math обойтись( x**(1.0/3)). Правда тоже с отрецательными числами не работает. ;)
Я думаю так должно работать:

x=complex(-8)
res=abs(x**(1.0/3))



Офлайн

#3 Сен. 29, 2006 12:00:49

koder
От:
Зарегистрирован: 2006-09-29
Сообщения: 95
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

rt3 = lambda x : (abs(x) ** ( 1.0 / 3 )) * (1,-1)



Отредактировано (Сен. 29, 2006 12:04:03)

Офлайн

#4 Сен. 29, 2006 12:03:13

koder
От:
Зарегистрирован: 2006-09-29
Сообщения: 95
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

P.S. кстати ( x**(1.0/3)) работать не может т.к. ето возведение отрицательного
числа в нецелую степень )). А о том что это 1/3 никакая мат. библиотека не догадается



Офлайн

#5 Сен. 29, 2006 12:11:29

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

koder
rt3 = lambda x : (abs(x) ** ( 1.0 / 3 )) * (1,-1)
А не проще сделать тогда так: lambda x:abs(complex(x)**(1.0/3)) ?



Офлайн

#6 Сен. 29, 2006 12:38:33

koder
От:
Зарегистрирован: 2006-09-29
Сообщения: 95
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

slivlen
….А не проще сделать тогда так: lambda x:abs(complex(x)**(1.0/3)) ?
При етом теряется знак : abs(complex(-8)**(1.0/3)) == 2.0
Да и не люблю я комплексную арифметику там где без нее можно обойтись -
лишние накладные расходы и многие тулзы типа psyco
не очень хорошо ее переваривают



Офлайн

#7 Сен. 29, 2006 13:30:34

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

Точно, я чо-то совсем на знак забил ;)

Получается решение проблемы в общем виде будет типа такого:

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



Офлайн

#8 Сен. 29, 2006 15:44:18

koder
От:
Зарегистрирован: 2006-09-29
Сообщения: 95
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

elif x > 0: return x**( 1.0 / power )
заменить на
elif x >= 0: return x**( 1.0 / power )
а то root(0,2) по исключению вылетать будет



Отредактировано (Сен. 29, 2006 16:07:41)

Офлайн

#9 Сен. 29, 2006 16:30:44

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

Патч принят ;)

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



Офлайн

#10 Окт. 2, 2006 12:52:17

albert
От:
Зарегистрирован: 2006-09-15
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Корень третьей степени из отрицательного числа.

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

Кстати а зачем может это понадобиться?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version