abs () vs fabs () разница в скорости и преимущество fabs()

Я провел несколько простых тестов на функции 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 () - сделать ваш код более читаемым, потому что, используя его, вы четко заявляете о своем намерение работы со значениями float/double point

есть ли другое использование fabs ()?

1 ответов


С ответ по электронной почте С Тим Петерс:

почему математика имеет функцию fabs? И оно и функция abs builtin закончите вызов fabs () для поплавков. abs () быстрее загружается.

ничего глубокого -- математический модуль поставляет все в стандарте C89 libm (+несколько расширений), fabs () является функцией std C89 libm.

нет ясной (для меня) причины, почему один было бы быстрее, чем другое; звучит случайно; математика.fabs (), безусловно, можно сделать быстрее (как в настоящее время реализовано (через math_1), он выдерживает кучу универсальный " попробуйте угадать, должен ли libm установить errno" шаблон, который тратится впустую (нет ошибок домена или диапазона возможно для fabs ())).

Кажется, нет никакой выгодной причины использовать fabs. Просто используйте abs практически для всех целей.