Go to the previous, next section.

## Normalization Functions

The functions described in this section are primarily provided as a way to efficiently perform certain low-level manipulations on floating point numbers that are represented internally using a binary radix; see section Floating Point Representation Concepts. These functions are required to have equivalent behavior even if the representation does not use a radix of 2, but of course they are unlikely to be particularly efficient in those cases.

All these functions are declared in `math.h'.

Function: double frexp (double value, int *exponent)

The `frexp` function is used to split the number value into a normalized fraction and an exponent.

If the argument value is not zero, the return value is value times a power of two, and is always in the range 1/2 (inclusive) to 1 (exclusive). The corresponding exponent is stored in `*exponent`; the return value multiplied by 2 raised to this exponent equals the original number value.

For example, `frexp (12.8, &exponent)` returns `0.8` and stores `4` in `exponent`.

If value is zero, then the return value is zero and zero is stored in `*exponent`.

Function: double ldexp (double value, int exponent)

This function returns the result of multiplying the floating-point number value by 2 raised to the power exponent. (It can be used to reassemble floating-point numbers that were taken apart by `frexp`.)

For example, `ldexp (0.8, 4)` returns `12.8`.

The following functions which come from BSD provide facilities equivalent to those of `ldexp` and `frexp`:

Function: double scalb (double value, int exponent)

The `scalb` function is the BSD name for `ldexp`.

Function: double logb (double x)

This BSD function returns the integer part of the base-2 logarithm of x, an integer value represented in type `double`. This is the highest integer power of `2` contained in x. The sign of x is ignored. For example, `logb (3.5)` is `1.0` and `logb (4.0)` is `2.0`.

When `2` raised to this power is divided into x, it gives a quotient between `1` (inclusive) and `2` (exclusive).

If x is zero, the value is minus infinity (if the machine supports such a value), or else a very small number. If x is infinity, the value is infinity.

The value returned by `logb` is one less than the value that `frexp` would store into `*exponent`.

Function: double copysign (double value, double sign)

The `copysign` function returns a value whose absolute value is the same as that of value, and whose sign matches that of sign. This is a BSD function.

Go to the previous, next section.