📅 2011-Oct-29 ⬩ ✍️ Ashwin Nanjappa ⬩ 🏷️ cpp, exponent, floating point, mantissa ⬩ 📚 Archive
The little-known frexp function from the C/C++ standard library can be used to extract the mantissa and exponent of a floating point number (float, double or long double):
#include <cmath>
const double d = 0.123;
int exponent;
const double mantissa = frexp( d, &exponent );
// Double: 0.123
// Mantissa: 0.984
// Exponent: -3
A few notes:
frexp
assumes that a floating point number is represented as mantissa * 2 ^ exponent
. This is a simple and convenient representation to work with. But, do keep in mind that this is not how the floating point number is actually stored.
For a positive floating point number, the mantissa returned by frexp
always lies in the range [0.5, 1.0)
. This range is enough since a mantissa in the range (0.0, 0.5)
can be converted to a value in [0.5, 1.0)
by multiplying it by a suitable 2 ^ exponent
. Note that the exponent
can be negative or positive. The exception to this mantissa value is the floating point number 0.0
, which is displayed as it is.
The mantissa and exponent returned by frexp
are in no way related to the actual mantissa and exponent values stored in the floating point number format. For example, the IEEE-754 format uses a sign bit and modifies the exponent value using an exponent bias.