Подтвердить что ты не робот

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()?

4b9b3361

Ответ 1

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

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

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

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

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