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:
frexpassumes that a floating point number is represented asmantissa * 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
frexpalways 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 suitable2 ^ exponent. Note that theexponentcan be negative or positive. The exception to this mantissa value is the floating point number0.0, which is displayed as it is. - The mantissa and exponent returned by
frexpare 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.