我正在用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
有关如何避免第一个输出并获得第二个输出的任何指针?我不完全确定第一个输出甚至代表什么。
答案 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
代替,但它们的意思相同。