Python 3输出奇怪的算术结果

时间:2017-10-09 12:38:02

标签: python math

我正在用Python编写计算器,并正在处理取幂。在处理小数的指数时,我遇到了一些非常奇怪的东西,所以我尝试在控制台中重现问题。这就是我得到的:

Python 3.5.2 (default, Oct 11 2016, 04:59:56) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> num1 = -3.0
>>> num2 = 2.5
>>> opr = '^'
>>> if opr == '^':
...     print(num1**num2)
... 
(4.772588574262081e-15+15.588457268119896j)
>>> -3.0**2.5
-15.588457268119896

有关如何避免第一个输出并获得第二个输出的任何指针?我不完全确定第一个输出甚至代表什么。

4 个答案:

答案 0 :(得分:7)

第一个输出正确。这是一个复数,因为你有一个负数的十进制幂。

您无法重现它,因为在最后一行中,您应该写(-3.0)**2.5。你所写的内容相当于-(3.0**2.5),因为取幂的优先级高于一元运算符-

答案 1 :(得分:5)

不同的输出只是由于operator precedence引起的操作顺序不同,请使用parantheses ()来确保应用正确的顺序:

>>> -3.0**2.5
-15.588457268119896
>>> -(3.0**2.5)
-15.588457268119896
>>> (-3.0)**2.5
(4.772588574262081e-15+15.588457268119896j)

答案 2 :(得分:2)

尝试这可以看看它是否有效。

num1 = -3.0
num2 = 2.5
opr = '^'
if opr == '^':
     if num1 < 0:
        num1  *= -1;
        print ('-',num1**num2)
        num1 *= -1;
     else:
        print(num1**num2)

答案 3 :(得分:2)

你的第二个例子:

-3.0**2.5

实际上在**操作上有更高的优先级,计算不同的东西:

-(3.0 ** 2.5)

您要计算的是:

(-3.0) ** 2.5

确实会产生(4.772588574262081e-15+15.588457268119896j)。这是一个复杂的数字,经过一些舍入和简化后看起来像这样:0 + 15.6j

如果您不理解为什么结果是复数,请手动执行:

首先,您可以将-3^2.5拆分为两部分:-1^2.5 * 3^2.5。右侧约为15.6,您在上面看到的数字。 -1^2.5可以扩展为(-1^0.5)^5。这与sqrt(-1)^5相同。简化一些:

sqrt(-1)^5 = i^5 = i*i*i*i*i = -1 * -1 * i = 1*i = i

因此,整个事情是15.6i。请注意,在数学中i用于复数的虚部,但在编程中它通常用j代替,但它们的意思相同。