wim*_*wim 1 python parsing ieee-754 complex-numbers
在计算复数时,python 喜欢摆弄符号。
>>> -0j
(-0-0j)
>>> (-0-0j)
0j
Run Code Online (Sandbox Code Playgroud)
为什么?
这里的问题是 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)))])'
Run Code Online (Sandbox Code Playgroud)
因此,这不是复数文字,而是复数和整数的反射减法。
>>> -0-0j
0j
>>> (0j).__rsub__((0).__neg__())
0j
Run Code Online (Sandbox Code Playgroud)
int 部分被强制为具有 0j 复数分量,然后由于减去复数分量,我们从结果中丢失了预期的有符号零。0j - 0j如IEEE 754-2008规定的那样,结果应为正号。
这可以说是解析器的问题,因为零的符号会影响方程的解。然而,这个问题在 python 跟踪器上被反复 提出和关闭,因为“不是错误”,所以看起来这种行为不会很快消失。当您关心有符号零时,初始化复数的可靠方法是调用complex内置函数:
>>> 0-0j
0j
>>> 0+0j
0j
>>> complex(0., -0.)
-0j
>>> complex(0., +0.)
0j
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |