【问题标题】:Bogus parsing/eval of complex literals复杂文字的虚假解析/评估
【发布时间】:2019-12-21 04:48:54
【问题描述】:

在计算复数时,python 喜欢摆弄符号。

>>> -0j
(-0-0j)
>>> (-0-0j)
0j

为什么?

nb:我在阅读this问题时注意到了这一点。

【问题讨论】:

    标签: python parsing ieee-754 complex-numbers


    【解决方案1】:

    这里的问题是 Python 不会将诸如 (-0-0j) 之类的复数解析为文字,它们实际上被解析为表达式:

    >>> import ast
    >>> ast.dump(ast.parse('(-0-0j)'))
    'Module(body=[Expr(value=BinOp(left=UnaryOp(op=USub(), operand=Num(n=0)), op=Sub(), right=Num(n=0j)))])'
    

    所以,这不是复数文字,而是复数和整数的反映减法。

    >>> -0-0j
    0j
    >>> (0j).__rsub__((0).__neg__())
    0j
    

    int 部分被强制为具有 0j 复数分量,然后由于减去了复数分量,我们从结果中丢失了预期的signed zero0j - 0j 的结果应该有正号,正如IEEE 754-2008 所指示的那样。

    这可以说是解析器问题,因为零的符号会影响方程的解。但是,问题一直是 python 跟踪器上的 repeatedly raisedclosed 为“不是错误”,因此看起来这种行为不会很快消失。当您关心有符号零时,初始化复数的可靠方法是调用 complex 内置函数:

    >>> 0-0j
    0j
    >>> 0+0j
    0j
    >>> complex(0., -0.)
    -0j
    >>> complex(0., +0.)
    0j
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2016-08-25
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多