【问题标题】:ValueError: negative number cannot be raised to a fractional powerValueError:负数不能提高到分数幂
【发布时间】:2013-07-19 21:29:51
【问题描述】:

当我在终端尝试这个时

>>> (-3.66/26.32)**0.2

我收到以下错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power

但是,我可以分两步完成此操作,例如,

>>> (-3.66/26.32)
-0.13905775075987842
>>> -0.13905775075987842 ** 0.2
-0.6739676327771593

为什么会有这种行为?单行解决这个问题的方法是什么?

【问题讨论】:

  • @Haidro,是的,我已经看到了这个问题,但我的问题是 (-1.07) ** 1.3 抛出错误,但 -1.07 ** 1.3 没有抛出错误,为什么?
  • 我认为这与复数有关。负 1 的平方根(分数幂)是 i。当它认为它正在进入复数领域时,它就会打包。

标签: python


【解决方案1】:

求幂优先于一元减号。

所以你有-(0.13905775075987842 ** 0.2),而不是你期望的(-0.13905775075987842) ** 0.2

>>> -0.13905775075987842 ** 0.2
-0.6739676327771593
>>> (-0.13905775075987842) ** 0.2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power

如果你想让它工作,你应该写(-3.66/26.32 + 0j)**0.2

>>> (-3.66/26.32 + 0j)**0.2
(0.5452512685753758+0.39614823506888347j)

或者按照@TimPietzcker 的说明切换 Python 3。

【讨论】:

  • 您还可以使用强制转换提升为复数:x = -1; complex(x)**0.5
  • @Prashant,这和-1 + 0j基本一样
  • 是的。只需添加另一种方式即可完成。这么小便条,不值得单独回答。
【解决方案2】:

切换到 Python 3,它会自动将结果提升为复数:

>>> (-3.66/26.32)**0.2
(0.5452512685753758+0.39614823506888347j)

【讨论】:

  • 只有我的老板才能做决定。
  • 这不能在 Python 2 中完成,因为正式的复数是在编译时启用的可选功能。并不是说我知道任何决定关闭默认开启开关的安装。
猜你喜欢
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多