In C++, std::abs
is overloaded for both signed integer and floating point types. std::fabs
only deals with floating point types (pre C++11). Note that the std::
is important; the C function ::abs
that is commonly available for legacy reasons will only handle int
!
The problem with
float f2= fabs(-9);
is not that there is no conversion from int
(the type of -9
) to double
, but that the compiler does not know which conversion to pick (int
-> float
, double
, long double
) since there is a std::fabs
for each of those three. Your workaround explicitly tells the compiler to use the int
-> double
conversion, so the ambiguity goes away.
C++11 solves this by adding double fabs( Integral arg );
which will return the abs
of any integer type converted to double
. Apparently, this overload is also available in C++98 mode with libstdc++ and libc++.
In general, just use std::abs
, it will do the right thing. (Interesting pitfall pointed out by @Shafik Yaghmour. Unsigned integer types do funny things in C++.)