📅 2011-Oct-29 ⬩ ✍️ Ashwin Nanjappa ⬩ 📚 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.