Floating Point Operations (GNAT User’s Guide for Native Platforms)

#### 6.3.1.6 Floating Point Operations ¶

On almost all targets, GNAT maps `Float` and `Long_Float` to the 32-bit and 64-bit standard IEEE floating-point representations and operations will use standard IEEE arithmetic as provided by the processor. On most, but not all, architectures, the attribute `Machine_Overflows` is `False` for these types, meaning that the semantics of overflow is implementation-defined. In the case of GNAT, these semantics correspond to the normal IEEE treatment of infinities and NaN (not a number) values. For example, 1.0 / 0.0 yields plus infinitiy and 0.0 / 0.0 yields a NaN. By avoiding explicit overflow checks, the performance is greatly improved on many targets. However, if required, you can enable floating-point overflow by using the pragma `Check_Float_Overflow`.

Another consideration that applies specifically to x86 32-bit architectures is which form of floating-point arithmetic is used. By default, the operations use the old style x86 floating-point, which implements an 80-bit extended precision form (on these architectures the type `Long_Long_Float` corresponds to that form). In addition, generation of efficient code in this mode means that the extended precision form is used for intermediate results. This may be helpful in improving the final precision of a complex expression, but it means that the results obtained on the x86 may be different from those on other architectures and, for some algorithms, the extra intermediate precision can be detrimental.

In addition to this old-style floating-point, all modern x86 chips implement an alternative floating-point operation model referred to as SSE2. In this model, there is no extended form and execution performance is significantly enhanced. To force GNAT to use this more modern form, use both of the switches:

> -msse2 -mfpmath=sse

A unit compiled with these switches will automatically use the more efficient SSE2 instruction set for `Float` and `Long_Float` operations. Note that the ABI has the same form for both floating-point models, so you can mix units compiled with and without these switches.