Excerpt from the C99 standard, normative annex F (The C++-standard does not explicitly mention this annex, though it includes all affected functions without change per reference. Also, the types have to match for compatibility.):

## IEC 60559 floating-point arithmetic

## F.1 Introduction

1 This annex specifies C language support for the IEC 60559 floating-point standard. The

IEC 60559 floating-point standard is specifically Binary floating-point arithmetic for

microprocessor systems, second edition (IEC 60559:1989), previously designated

IEC 559:1989 and as IEEE Standard for Binary Floating-Point Arithmetic

(ANSI/IEEE 754−1985). IEEE Standard for Radix-Independent Floating-Point

Arithmetic (ANSI/IEEE 854−1987) generalizes the binary standard to remove

dependencies on radix and word length. IEC 60559 generally refers to the floating-point

standard, as in IEC 60559 operation, IEC 60559 format, etc. An implementation that

defines`__STDC_IEC_559__`

shall conform to the specifications in this annex.356)

Where a binding between the C language and IEC 60559 is indicated, the

IEC 60559-specified behavior is adopted by reference, unless stated otherwise. Since

negative and positive infinity are representable in IEC 60559 formats, all real numbers lie

within the range of representable values.

So, include `<math.h>`

(or in C++ maybe `<cmath>`

), and test for `__STDC_IEC_559__`

.

If the macro is defined, not only are the types better specified (`float`

being 32bits and `double`

being 64bits among others), but also the behavior of builtin operators and standard-functions is more specified.

Lack of the macro does not give any guarantees.

For x86 and x86_64 (amd64), you can rely on the types `float`

and `double`

being IEC-60559-conformant, though functions using them and operations on them might not be.