我在abs()和fabs()函数上运行了一些简单的测试,我不明白使用fabs()有什么好处,如果是:
1)慢一点
2)仅适用于花车
如果在其他类型上使用,3)将抛出异常
In [1]: %timeit abs(5)
10000000 loops, best of 3: 86.5 ns per loop
In [3]: %timeit fabs(5)
10000000 loops, best of 3: 115 ns per loop
In [4]: %timeit abs(-5)
10000000 loops, best of 3: 88.3 ns per loop
In [5]: %timeit fabs(-5)
10000000 loops, best of 3: 114 ns per loop
In [6]: %timeit abs(5.0)
10000000 loops, best of 3: 92.5 ns per loop
In [7]: %timeit fabs(5.0)
10000000 loops, best of 3: 93.2 ns per loop
浮子上的速度更慢了!
我站在哪里使用fabs()的唯一好处是让你的代码更具可读性,因为通过使用它,你明确表明你使用浮点/双点值的意图
有没有其他用途的fabs()?
答案 0 :(得分:18)
来自an email response的Tim Peters:
为什么数学有fabs功能?它和abs内置功能 结束了为花车调用fabs()。 abs()启动速度更快。
没什么深刻的 - 数学模块提供C89标准中的所有内容 libm(+一些扩展),fabs()是一个标准的C89 libm函数。
没有一个明确的(对我来说)理由为什么一个人会更快 其他;听起来很意外; math.fabs()当然可以更快 (正如目前所实施的(通过math_1),它经历了一堆 通用“试图猜测libm是否应该设置errno” 浪费的样板(没有域或范围错误 可能为fabs()))。
似乎没有理由使用fabs
。只需使用abs
几乎用于所有目的。