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++.)

Answer from Baum mit Augen on Stack Overflow
Top answer
1 of 3
49

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++.)

2 of 3
19

With C++ 11, using abs() alone is very dangerous:

#include <iostream>
#include <cmath>

int main() {
    std::cout << abs(-2.5) << std::endl;
    return 0;
}

This program outputs 2 as a result. (See it live)

Always use std::abs():

#include <iostream>
#include <cmath>

int main() {
    std::cout << std::abs(-2.5) << std::endl;
    return 0;
}

This program outputs 2.5.

You can avoid the unexpected result with using namespace std; but I would adwise against it, because it is considered bad practice in general, and because you have to search for the using directive to know if abs() means the int overload or the double overload.

🌐
Reddit
reddit.com › r/cpp_questions › difference between abs() and fabs(), and can i replace with each other in the program?? and abs() fn is kinda not working.....
r/cpp_questions on Reddit: Difference between abs() and fabs(), and can i replace with each other in the program?? And abs() fn is kinda not working.....
November 26, 2019 - fabs is one of a family of type-specific names from C. The C++ standard libraries provide these names, fabsf for float, fabs for double and fabsl for long double, for compatibility with C, so that barring other issues C code that uses these ...
Discussions

What is the difference between abs() and fabs() functions?
What is the difference between abs() and fabs() functions in C language? More on youth4work.com
🌐 youth4work.com
5
0
fabs versus abs? - C++ Forum
C++ provides overload of abs() for all arithmetic types. fabs() and labs() are provided for backward compatibility with C, which does not have function overloading and had to have different fucntions for different types. More on cplusplus.com
🌐 cplusplus.com
June 22, 2014
c++ - When do I use fabs and when is it sufficient to use std::abs? - Stack Overflow
I assume that abs and fabs are behaving different when using math.h. But when I use just cmath and std::abs, do I have to use std::fabs or fabs? Or isn't this defined? More on stackoverflow.com
🌐 stackoverflow.com
Python - abs vs fabs - Stack Overflow
Two more points: this still compares ... while fabs is at module namespace. Do "xabs = abs" then xabs(num) to remove that effect. Also, with Python 3.2 things change quite a bit and apparently abs() is quite a bit faster (>2x), at least on floats. 2013-01-03T02:14:26.64Z+00:00 ... @PeterHansen You are right, those are from two runs under different system ... More on stackoverflow.com
🌐 stackoverflow.com
🌐
Quora
quora.com › What-is-the-difference-between-abs-and-fabs-function
What is the difference between abs() and fabs() function? - Quora
abs() and fabs () functions, both ... 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....
🌐
GeeksforGeeks
geeksforgeeks.org › python › python-fabs-vs-abs
Python | fabs() vs abs() - GeeksforGeeks
August 9, 2021 - 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.
🌐
TutorialsPoint
tutorialspoint.com › python-fabs-vs-abs
Python - fabs() vs abs()
July 22, 2020 - Unlike the abs() method, the fabs() method will always produce the result in float type; and it does not accept complex numbers as its arguments.
🌐
Codecademy
codecademy.com › docs › c++ › math functions › fabs()
C++ (C Plus Plus) | Math Functions | fabs() | Codecademy
April 13, 2025 - fabs() is designed for floating-point types (float, double, long double) while abs() is typically used with integer types. Using abs() with floating-point values may cause implicit type conversion and potential precision loss.
🌐
Youth4work
youth4work.com › talent › c language › forum › what is the difference between abs() and fabs() functions?
What is the difference between abs() and fabs() functions?
Basically, both is used to get the absolute value of the given value. abs() is used for Integer values whereas fabs() is used for floating type data.
🌐
Cppreference
en.cppreference.com › w › cpp › numeric › math › fabs.html
std::abs(float), std::fabs, std::fabsf, std::fabsl - cppreference.com
March 14, 2025 - 1-4) Computes the absolute value of the floating-point value num. The library provides overloads of std::abs and std::fabs for all cv-unqualified floating-point types as the type of the parameter num.(since C++23)
Find elsewhere
🌐
CodeSpeedy
codespeedy.com › home › difference between fabs and abs function in c++
Difference between fabs and abs function in C++ - CodeSpeedy
September 14, 2022 - Fabs() and abs() functions are ... between the fabs() and abs() function is that fabs() function is used for floating values and abs() function is used for integer values....
🌐
IncludeHelp
includehelp.com › python › abs-vs-fabs-methods.aspx
Difference between abs() and fabs() methods in Python
abs() method returns either an integer value or a float value based on given number type. But, fabs() method returns only float value, no matter given number is an integer type or a float type. ... Comments and Discussions!
🌐
Sololearn
sololearn.com › en › Discuss › 2784928 › fabs-and-abs
fabs and abs | Sololearn: Learn to code for FREE!
May 15, 2021 - ... f in fabs stands for float The difference is that math.fabs(number) will always return a floating point number even if the argument is integer, whereas abs() will return a floating point or an integer depending upon the argument.
🌐
Krayonnz
krayonnz.com › user › doubts › detail › 61894a1591cca20041786b9f › difference-between-abs-and-fabs-functions-in-C
Difference between abs() and fabs() functions in C ?
The fastest growing social learning network of students. Participate in quizzes and competitions to win cash & exciting prizes. Host your college competitions & quizzes. Buy & Sell verified notes. Ask & answer doubts.
🌐
Sololearn
sololearn.com › en › Discuss › 1799301 › qus10what-is-the-difference-between-abs-and-fabs-functions
Qus10:-What is the difference between abs() and fabs() functions? | Sololearn: Learn to code for FREE!
Hi if you have a float number, ... 239 ... Both are used to get the absolute value. Abc is used to get the integer value and fabs os used to get the floating type data.....
🌐
Cplusplus
cplusplus.com › forum › beginner › 136274
fabs versus abs? - C++ Forum
June 22, 2014 - C++ provides overload of abs() for all arithmetic types. fabs() and labs() are provided for backward compatibility with C, which does not have function overloading and had to have different fucntions for different types.
🌐
TutorialsPoint
tutorialspoint.com › What-is-difference-in-abs-and-fabs-in-Python
What is difference in abs() and fabs() in Python?
March 2, 2020 - Both abs() and fabs() represent the mathematical functions which give us the absolute value of numbers. But there is a subtle difference between both of them which we can explore in the exmaples below. Example The abs() functions ret
🌐
OpenGenus
iq.opengenus.org › fabs-and-abs-in-cpp
Fabs and abs in C++
January 12, 2023 - The main difference between fabs and abs in C++ is the type of input they accept and the type of output they return.
🌐
Tejsumeru
tejsumeru.com › home › what is the difference between abs() and fabs() functions?
What is the difference between abs() and fabs() functions? - Tejsumeru
December 15, 2019 - Both functions are to retrieve absolute value. abs() is for integer values and fabs() is for floating type numbers.
🌐
Youth4work
youth4work.com › talent › c language › forum › answer › answer for what is the difference between abs() and fabs() functions?
Answer for What is the difference between abs() and fabs() functions?
Answer for What is the difference between abs() and fabs() functions? Answer · What is the difference between abs() and fabs() functions in C language? Sandeep · 13 Jul · 45794 Views · 5 Answers · Your Answer · Sahil · 11 Jul · Description The C library function int abs(int x) returns the absolute value of int x.
Top answer
1 of 5
139

math.fabs() converts its argument to float if it can (if it can't, it throws an exception). It then takes the absolute value, and returns the result as a float.

In addition to floats, abs() also works with integers and complex numbers. Its return type depends on the type of its argument.

In [7]: type(abs(-2))
Out[7]: int

In [8]: type(abs(-2.0))
Out[8]: float

In [9]: type(abs(3+4j))
Out[9]: float

In [10]: type(math.fabs(-2))
Out[10]: float

In [11]: type(math.fabs(-2.0))
Out[11]: float

In [12]: type(math.fabs(3+4j))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/npe/<ipython-input-12-8368761369da> in <module>()
----> 1 type(math.fabs(3+4j))

TypeError: can't convert complex to float
2 of 5
10

Edit: as @aix suggested, a better (more fair) way to compare the speed difference:

In [1]: %timeit abs(5)
10000000 loops, best of 3: 86.5 ns per loop

In [2]: from math import fabs

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

In [8]: %timeit abs(-5.0)
10000000 loops, best of 3: 91.8 ns per loop

In [9]: %timeit fabs(-5.0)
10000000 loops, best of 3: 91 ns per loop

So it seems abs() only has slight speed advantage over fabs() for integers. For floats, abs() and fabs() demonstrate similar speed.


In addition to what @aix has said, one more thing to consider is the speed difference:

In [1]: %timeit abs(-5)
10000000 loops, best of 3: 102 ns per loop

In [2]: import math

In [3]: %timeit math.fabs(-5)
10000000 loops, best of 3: 194 ns per loop

So abs() is faster than math.fabs().