21

我对 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() 还有其他用途吗?

4

1 回答 1

21

来自Tim Peters电子邮件回复

为什么 math 有 fabs 函数?它和 abs 内置函数最终都会调用 fabs() 以获取浮点数。abs() 启动速度更快。

没什么深奥的——数学模块提供了 C89 标准 libm 中的所有内容(+ 一些扩展), fabs() 是一个标准 C89 libm 函数。

没有一个明确的(对我而言)为什么一个会比另一个快的原因;听起来很意外;math.fabs() 当然可以变得更快(正如当前实现的那样(通过 math_1),它忍受了一堆通用的“尝试猜测 libm 是否应该设置 errno”样板被浪费了(没有域或范围错误可能对于晶圆厂()))。

似乎没有有利的理由使用fabs. 几乎可abs用于所有目的。

于 2014-02-24T17:06:43.557 回答