2016-06-12 2 views
-1

Я пишу некоторые простые математические функции в Python. Мне нужно использовать метод eval() для оценки введенной пользователем функции. Однако, если пользователь вводит функцию y = x ** 0.4, мой код начинает давать комплексные числа, когда x отрицателен. Как и в тесте, я написал:Метод eval() Возвращение нежелательного комплексного номера в Python

print(eval("(-9.451)**0.4")) 

Где -9.451 - это случайное отрицательное число.

Это возвращает:

(0.7588806326318368+2.335594429732145j) 

В действительности, (-9,451) ** 0,4 следует оценивать в 2.455789314.

Чтобы доказать это, заметим, график у = х ** 0,4:

See this image

Почему я получаю комплексные числа?

Любая помощь была бы принята с благодарностью. Спасибо ...

ответ

3

В действительности, (-9,451) ** 0,4 следует оценивать в 2.455789314

Нет, квадрат реального пятого корня -9.451 это (примерно) 2,455789314. Когда вы используете отрицательные числа в качестве основы экспонентов, вы теряете приятные свойства, такие как square (fiveroot (x)) = x^0.4. Кроме того, когда вы используете двоичную с плавающей запятой, 2/5 не является точно представимым. Поплавок 0.4 фактически равен

>>> import decimal 
>>> decimal.Decimal(0.4) 
Decimal('0.40000000000000002220446049250313080847263336181640625') 

... что гигантская вещь, которая является самым близким представляемым числом 0,4.

Для такой операции, как (-9.451)**0.4, нет разумного способа интерпретировать ее без сложных чисел, и оказывается, что лучшая интерпретация в терминах комплексных чисел дает (0.7588806326318368+2.335594429732145j). Python 2 даст вам ошибку, вместо того, чтобы делать сложные арифметические операции:

>>> (-9.451)**0.4 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: negative number cannot be raised to a fractional power 

Диаграмма вы связаны выглядит как ошибка в инструменте, который вы использовали. Он должен либо не показать ничего для х < 0 или показать что-то вроде того, что Wolfram Alpha показывает, с ненулевой мнимой частью для й < 0.

+0

Большое вам спасибо за ваш быстрый ответ. Я постараюсь учесть это в будущем. – Eragon20

1

Нет, 0.7588806326318368 + 2.335594429732145j - правильный ответ.

2.455789314 будет результатом 9,451 ** 0,4, а не -9,451.

+0

Но если вы посмотрите на график у = х^0,4, то становится ясно, что как положительные, 9,451 и отрицательные 9,451 должны вычисляться 2.456 , Попробуйте в Desmos (https://www.desmos.com/calculator) – Eragon20

+1

@ Eragon20: Я не знаю, что эта вещь делает, но выглядит неправильно. [Wolfram Alpha] (https://www.wolframalpha.com/input/?i=x%5E0.4) дает сложные номера. – user2357112

+0

@ Eragon20 Desmos дает «неопределенный» для квадратного корня из -1: это почти наверняка неправильно. – tfb

0

Извините, но вы понимаете, что вы пытаетесь вычислить корень из отрицательного числа? Вы можете просто использовать функцию abs здесь, чтобы решить эту проблему, я думаю :)

>>> eval("abs(-9.451)**0.4") 
2.4557893140046687 
+0

Вы абсолютно правы. Я полагаю, что меня просто путают, потому что мой графический калькулятор говорит мне, что -9.451, поднятый до 0,4, равен 2.456. Я не знаю, почему это так, но я полностью понимаю, что корень отрицательного числа нельзя принять. Я буду использовать ваше решение ... это больше, чем решает мою проблему. Еще раз спасибо за вашу помощь, и извините, что я не думал об этом так же хорошо, как должен! – Eragon20

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