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.