【发布时间】:2019-12-21 04:48:54
【问题描述】:
【问题讨论】:
标签: python parsing ieee-754 complex-numbers
【问题讨论】:
标签: python parsing ieee-754 complex-numbers
这里的问题是 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 zero。 0j - 0j 的结果应该有正号,正如IEEE 754-2008 所指示的那样。
这可以说是解析器问题,因为零的符号会影响方程的解。但是,问题一直是 python 跟踪器上的 repeatedly raised 和 closed 为“不是错误”,因此看起来这种行为不会很快消失。当您关心有符号零时,初始化复数的可靠方法是调用 complex 内置函数:
>>> 0-0j
0j
>>> 0+0j
0j
>>> complex(0., -0.)
-0j
>>> complex(0., +0.)
0j
【讨论】: