eval()方法在Python

时间:2016-06-12 22:20:36

标签: python math

我正在用Python编写一些简单的数学函数。我需要使用eval()方法来评估用户输入的函数。但是,如果用户输入函数y = x ** 0.4,当x为负时,我的代码开始产生复数。就像测试一样,我写道:

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

其中-9.451只是一个随机的负数。

返回:

(0.7588806326318368+2.335594429732145j)

实际上,( - 9.451)** 0.4应评估为2.455789314。

为证明这一点,请观察y = x ** 0.4:

的图表

See this image

为什么我会得到复杂的数字?

非常感谢任何帮助。谢谢......

3 个答案:

答案 0 :(得分:2)

  

实际上,( - 9.451)** 0.4应评估为2.455789314

不,-9.451的实际第五根的平方是(大致)2.455789314。当你使用负数作为指数的基础时,你会失去像square(fifthroot(x))= x ^ 0.4这样的好的属性。此外,当您使用二进制浮点时,2/5并不能完全表示。 float 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

您链接的图表看起来像您使用的工具中的错误。它应该不显示x&lt; 0或显示类似Wolfram Alpha显示的内容,x&lt; 0&lt; 0&lt; 0&lt; 0

答案 1 :(得分:1)

抱歉,您意识到您正在尝试计算负数的根?你可以在这里使用class HomeListView(Searchmixin, ListView)函数来解决这个问题,我想:)

abs

答案 2 :(得分:0)

不,0.7588806326318368 + 2.335594429732145j是正确答案。

2.455789314将是9.451 ** 0.4的结果,而不是-9.451。