Python中eval函数处理负数值开三次方输出不一致的原因咨询
为什么Python中
(-0.02)**(1/3)和-0.02**(1/3)结果不同? 这两个表达式的差异来自**运算符的优先级,以及Python对负数分数次幂的处理逻辑:
运算符优先级高于负号:
eval("-0.02**(1/3)")会先计算0.02**(1/3)(正数的三次方根,结果是实数0.2714417616594907),再对结果取负,最终得到-0.2714417616594907。负数直接作为底数时的复数运算逻辑:
eval("(-0.02)**(1/3)")是对负数-0.02直接计算三次方根。在数学的复数域中,负数的奇数次方根有多个解,Python的幂运算基于复变函数定义,会返回复数形式的主根,你得到的(0.13572088082974537+0.23507546124511977j)就是这个主根,它的三次方等于-0.02。正数的情况无差异:
当底数是正数时,不管有没有括号,**运算的对象都是正数,三次方根只有一个实数值,所以(0.02)**(1/3)和0.02**(1/3)结果一致。
内容的提问来源于stack exchange,提问作者D_Delta
相关产品推荐
相关产品推荐

