英文:
Eval giving inconsistent outputs
问题
在使用 Python 中的 eval 函数进行实验时,我发现 eval 函数的工作方式与我预期的不同。
当我传递 eval("(-0.02)**(1/3)")
时,输出结果为 (0.13572088082974537+0.23507546124511977j)
。
但是当执行 eval("-0.02**(1/3)")
时,输出结果为 -0.2714417616594907
。
我尝试使用正数而不是负数,它却正常工作了。
eval("(0.02)**(1/3)")
0.2714417616594907
eval("0.02**(1/3)")
0.2714417616594907
有人能解释为什么会发生这种情况以及原因吗?
英文:
While experimenting with the eval function in python I found that eval function was not working as I excepted it to do
when I passed eval("(-0.02)**(1/3)")
the output was (0.13572088082974537+0.23507546124511977j)
but when eval("-0.02**(1/3)")
was executed the output was -0.2714417616594907
I tried using positive numbers instead and it worked
eval("(0.02)**(1/3)")
0.2714417616594907
eval("0.02**(1/3)")
0.2714417616594907
Can someone explain what and why is it happening
答案1
得分: 1
这是因为 **
(幂运算)比 -
(一元取反)具有更高的优先级(参见手册)。因此,
-0.02**(1/3)
被计算为
-(0.02**(1/3))
即
-0.2714417616594907
相比之下,在 (-0.02)**(1/3)
中的 ()
使得计算 -0.02
的立方根,结果是 0.13572088082974537+0.23507546124511977j
(一个复数)。
请注意,这与 eval
无关,将这些表达式键入Python解释器将得到相同的结果。
英文:
This is because **
(exponentiation) has higher precedence than -
(unary negation) (see the manual). As a result,
-0.02**(1/3)
is evaluated as
-(0.02**(1/3))
i.e.
-0.2714417616594907
By comparison, the ()
around -0.02
in (-0.02)**(1/3)
makes that the computation of the cube root of -0.02
, which is 0.13572088082974537+0.23507546124511977j
(a complex number).
Note this has nothing to do with eval
, you will get the same results by typing those expressions into the python interpreter.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论