如何通过-0.0和0.0得到Python除法分别得到-Inf和Inf?

Chu*_*uck 11 python ieee-754 divide-by-zero python-2.7

我有一种情况,即除以0.0或-0.0是合理的,我希望分别看到+ Inf和-Inf作为结果.似乎Python喜欢抛出一个

ZeroDivisionError: float division by zero
Run Code Online (Sandbox Code Playgroud)

在任一情况下.显然,我认为我可以用0.0的测试简单地包装它.但是,我找不到区分+0.0和-0.0的方法.(仅供参考,您可以通过键入或通过常见计算(例如-1.0*0.0)轻松获得-0.0.

IEEE非常好地处理了这一切,但Python似乎很难隐藏经过深思熟虑的IEEE行为.事实上,0.0 == -0.0实际上是一个IEEE功能,因此Python的行为严重破坏了事情.它在C,Java,Tcl甚至JavaScript中运行良好.

建议?

Mar*_*som 11

from math import copysign

def divide(numerator, denominator):
    if denominator == 0.0:
        return copysign(float('inf'), denominator)
    return numerator / denominator

>>> divide(1, -0.0)
-inf
>>> divide(1, 0)
inf
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于正分子。**编辑:** 好吧,从技术上讲,它确实回答了问题_如所写_(“分别生成 -Inf 和 Inf _”),所以也许我更愿意对这个问题提出质疑 (3认同)
  • 结果“ inf”的符号应取决于分子和分母。 (2认同)

Set*_*ton 8

我完全同意@Mark Ransom,除了我会try改用:

def f(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return copysign(float('inf'), denominator)
Run Code Online (Sandbox Code Playgroud)

我建议这样做的原因是,如果您多次执行此功能,则在尝试除法之前,如果值为零,则不必浪费时间进行每次迭代检查.

编辑:

我比较tryif功能的速度:

def g(a, b):
    if b == 0:
        return copysign(float('inf'), b)
    else:
        return a / b
Run Code Online (Sandbox Code Playgroud)

这是测试:

s = time.time()
[f(10, x) for x in xrange(-1000000, 1000000, 1)]
print 'try:', time.time()-s
s = time.time()
[g(10, x) for x in xrange(-1000000, 1000000, 1)]
print 'if:', time.time()-s
Run Code Online (Sandbox Code Playgroud)

结果如下:

try: 0.573683023453
if: 0.610251903534
Run Code Online (Sandbox Code Playgroud)

这表明try方法更快,至少在我的机器上.

  • 与 MarkRansom 的答案相同的问题:结果 `inf` 的符号应该取决于分子和分母。 (2认同)