#### 20.8.5 Setting and modifying single bits of FP values

There are some operations that are too complicated or expensive to perform by hand on floating-point numbers. ISO C99 defines functions to do these operations, which mostly involve changing single bits.

— Function: double copysign (double x, double y)

> — Function: float copysignf (float x, float y)

> > — Function: long double copysignl (long double x, long double y)

> > > These functions return x but with the sign of y. They work even if x or y are NaN or zero. Both of these can carry a sign (although not all implementations support it) and this is one of the few operations that can tell the difference.

> > > `copysign` never raises an exception.

> > > This function is defined in IEC 559 (and the appendix with recommended functions in IEEE 754/IEEE 854).

— Function: int signbit (float-type x)

> `signbit` is a generic macro which can work on all floating-point types. It returns a nonzero value if the value of x has its sign bit set.

> This is not the same as `x < 0.0`, because IEEE 754 floating point allows zero to be signed. The comparison `-0.0 < 0.0` is false, but `signbit (-0.0)` will return a nonzero value.

— Function: double nextafter (double x, double y)

> — Function: float nextafterf (float x, float y)

> > — Function: long double nextafterl (long double x, long double y)

> > > The `nextafter` function returns the next representable neighbor of x in the direction towards y. The size of the step between x and the result depends on the type of the result. If x = y the function simply returns y. If either value is `NaN`, `NaN` is returned. Otherwise a value corresponding to the value of the least significant bit in the mantissa is added or subtracted, depending on the direction. `nextafter` will signal overflow or underflow if the result goes outside of the range of normalized numbers.

> > > This function is defined in IEC 559 (and the appendix with recommended functions in IEEE 754/IEEE 854).

— Function: double nexttoward (double x, long double y)

> — Function: float nexttowardf (float x, long double y)

> > — Function: long double nexttowardl (long double x, long double y)

> > > These functions are identical to the corresponding versions of `nextafter` except that their second argument is a `long double`.

— Function: double nan (const char *tagp)

> — Function: float nanf (const char *tagp)

> > — Function: long double nanl (const char *tagp)

> > > The `nan` function returns a representation of NaN, provided that NaN is supported by the target platform. `nan ("`n-char-sequence`")` is equivalent to `strtod ("NAN(`n-char-sequence`)")`.

> > > The argument tagp is used in an unspecified manner. On IEEE 754 systems, there are many representations of NaN, and tagp selects one. On other systems it may do nothing.