2015-02-24 4 views
0

Я ищу способ точно вычислить корни отрицательных чисел в Python. Я считаю, что неточностей я вижу, связаны с плавающей точкой, но мне кажется, что там должен быть способ, чтобы получить правильный ответ на что-то так просто, как это:Точные корни отрицательных чисел в Python

>>(-1+0j)**0.1 
(0.9510565162951535+0.3090169943749474j) 

Ответ Я ожидаю в этот случай (0+1j). Хотя повышение ответа Питона на десятое приближается к -1, я ищу ответ, полученный из более точного метода, то есть тот, который при поднятии до десятого равно ровно -1, а не число, действительно близкое к -1.

Есть ли способ сделать это правильно с помощью собственной библиотеки Python или sympy/numpy/scipy и т. Д.?

+3

Существует не такая вещь, как * * -ый корень из комплексного числа. Python дал вам * * десятый корень, вплоть до пределов представления с плавающей запятой. Как вы хотите указать, какой корень вы хотите получить? – user2357112

+1

Стоит отметить, что '0,1' невозможно точно представить в плавающей точке. Попробуйте 'sum (0,1 для _ в диапазоне (8))' для примера ошибок округления, к которым это может привести. – Blckknght

+0

@ user2357112 Было бы неплохо получить все из них, и было бы идеально, если бы я не мог иметь дело с плавающей точкой. Вот почему я упоминаю sympy - я бы предпочел получить символические ответы в терминах целых чисел и i, чем с плавающей запятой. – Marty

ответ

1

-1 имеет не один, а 10 сложных десятых корней. У вас есть только один из них. Если a ваш вернулся корень, a ** 5 также является корнем:

(а ** 5) ** 10 = (а ** 10) ** 5 = (-1) ** 5 = -1

Но если вы бежите:

a = (-1 + 0j) ** 0.1 
print(a) 
print(a ** 5) 

вы получите:

(0.951056516295+0.309016994375j) 
(1.11022302463e-16+1j) 

вы видите a ** 5 очень близко к 1j.

Смежные вопросы