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
практически для всех целей.