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)
我完全同意@Mark Ransom,除了我会try改用:
def f(a, b):
try:
return a / b
except ZeroDivisionError:
return copysign(float('inf'), denominator)
Run Code Online (Sandbox Code Playgroud)
我建议这样做的原因是,如果您多次执行此功能,则在尝试除法之前,如果值为零,则不必浪费时间进行每次迭代检查.
编辑:
我比较try了if功能的速度:
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方法更快,至少在我的机器上.
| 归档时间: |
|
| 查看次数: |
1424 次 |
| 最近记录: |