Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

abs() vs fabs() speed difference and advantage of fabs()

Tags:

I ran some simple tests on abs() and fabs() functions and I don't understand what are the advantages of using fabs(), if it is:

1) slower

2) works only on floats

3) will throw an exception if used on a different type

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

it's even slower on floats!

From where I am standing the only advantage of using fabs() is to make your code more readable, because by using it, you are clearly stating your intention of working with float/double point values

Is there any other use of fabs()?

like image 222
metabuddy Avatar asked Feb 24 '14 16:02

metabuddy


People also ask

What is the difference between abs () and fabs ()?

Python | fabs() vs abs() Both will return the absolute value of a number. The difference is that math. fabs(number) will always return a floating-point number even if the argument is an integer, whereas abs() will return a floating-point or an integer depending upon the argument.

What is the difference between fabs and abs C++?

abs() and fabs () functions, both are used to retrieve or calculate the absolute value. The only difference between both of them is, abs() is used to calculate the absolute value for integer type numbers whereas fabs() are used for floating type numbers. abs() function is use under the library file <stdlib.

What is the use of fabs () function?

The fabs() function calculates the absolute value of the floating-point argument x.

Is the output of function abs () same as math fabs ()?

Is the output of the function abs() the same as that of the function math. fabs()? Explanation: math. fabs() always returns a float and does not work with complex numbers whereas the return type of abs() is determined by the type of value that is passed to it.


1 Answers

From an email response from Tim Peters:

Why does math have an fabs function? Both it and the abs builtin function wind up calling fabs() for floats. abs() is faster to boot.

Nothing deep -- the math module supplies everything in C89's standard libm (+ a few extensions), fabs() is a std C89 libm function.

There isn't a clear (to me) reason why one would be faster than the other; sounds accidental; math.fabs() could certainly be made faster (as currently implemented (via math_1), it endures a pile of general-purpose "try to guess whether libm should have set errno" boilerplate that's wasted (there are no domain or range errors possible for fabs())).

It seems there is no advantageous reason to use fabs. Just use abs for virtually all purposes.

like image 102
Inbar Rose Avatar answered Sep 21 '22 22:09

Inbar Rose