/FLOAT=option
Controls the format of floating-point variables.
Options:
D_FLOAT Double variables are represented in D_FLOAT
format. The __D_FLOAT macro is predefined.
G_FLOAT Double variables are represented in G_FLOAT
format. The __G_FLOAT macro is predefined.
IEEE_FLOAT Float and double variables are represented in IEEE
floating-point format (S_FLOAT and T_FLOAT,
respectively). The __IEEE_FLOAT macro or _IEEE_FP
macro (if/IEEE_MODE=DENORM_RESULTS) is predefined.
See also the /IEEE_MODE qualifier for selecting an
IEEE floating-point mode.
If /IEEE_MODE is not specified, the default
behavior is /IEEE_MODE=FAST for Alpha systems and
DENORM_RESULTS for I64 systems.
On OpenVMS I64 systems, /FLOAT=IEEE_FLOAT is the default
floating-point representation. The _IEEE_FP macro is predefined by
default, IEEE format data is assumed, and IEEE floating-point
instructions are used. There is no hardware support for
floating-point representations other than IEEE, although you can
specify the /FLOAT=D_FLOAT or /FLOAT=G_FLOAT compiler option.
These VAX floating-point formats are supported in the I64 compiler
by generating run-time code that converts VAX floating-point
formats to IEEE format to perform arithmetic operations, and then
converts the IEEE result back to the appropriate VAX floating-point
format. This imposes additional run-time overhead and some loss of
accuracy compared to performing the operations in hardware on Alpha
and VAX systems. The software support for the VAX formats is
provided to meet an important functional compatibility requirement
for certain applications that need to deal with on-disk binary
floating-point data.
On I64 systems, the default for /IEEE_MODE is DENORM_RESULTS. This
is a change from the default of /IEEE_MODE=FAST on Alpha systems.
This means that by default, floating-point operations may silently
generate values that print as Infinity or Nan (the
industry-standard behavior), instead of issuing a fatal run-time
error as they would when using VAX floating-point format or
/IEEE_MODE=FAST. Also, the smallest-magnitude nonzero value in
this mode is much smaller because results are allowed to enter the
denormal range instead of being flushed to zero as soon as the
value is too small to represent with normalization.
The conversion of VAX floating-point formats to IEEE single and
IEEE double floating-point types on the Intel Itanium architecture
is a transparent process that will not impact most applications.
All you need to do is recompile your application. Because IEEE
floating-point format is the default, unless your build explicitly
specifies VAX floating-point format options, a simple rebuild for
I64 systems will use the native IEEE formats directly. For the
large class of programs that do not directly depend on the VAX
formats for correct operation, this is the most desirable way to
build for I64 systems.
When you compile an OpenVMS application that specifies an option to
use VAX floating-point on the Itanium architecture, the compiler
automatically generates code for converting floating-point formats.
Whenever the application performs a sequence of arithmetic
operations, this code does the following:
o Converts VAX floating-point formats to either IEEE single or
IEEE double floating-point formats.
o Performs arithmetic operations in IEEE floating-point
arithmetic.
o Converts the resulting data from IEEE formats back to VAX
formats.
Where no arithmetic operations are performed (VAX float fetches
followed by stores), no conversion will occur. The code handles
such situations as moves.
VAX floating-point formats have the same number of bits and
precision as their equivalent IEEE floating-point formats. For
most applications the conversion process will be transparent and
thus a non-issue.
In a few cases, arithmetic calculations might have different
results because of the following differences between VAX and IEEE
formats:
o Values of numbers represented
o Rounding rules
o Exception behavior
These differences might cause problems for applications that do any
of the following:
o Depend on exception behavior
o Measure the limits of floating-point behaviors
o Implement algorithms at maximal processor-specific accuracy
o Perform low-level emulations of other floating-point processors
o Use direct equality comparisons between floating-point values,
instead of appropriately ranged comparisons (a practice that is
extremely vulnerable to changes in compiler version or compiler
options, as well as architecture)
You can test an application's behavior with IEEE floating-point
values by compiling it on an OpenVMS Alpha system using
/FLOAT=IEEE_FLOAT/IEEE_MODE=DENORM. If that produces acceptable
results, simply build the application on the I64 system using the
same qualifier.
If you determine that simply recompiling with an /IEEE_MODE
qualifier is not sufficient because your application depends on the
binary representation of floating-point values, then first try
building for your I64 system by specifying the VAX floating-point
option that was in effect for your VAX or Alpha build. This causes
the representation seen by your code and on disk to remain
unchanged, with some additional runtime cost for the conversions
generated by the compiler. If this is not an efficient approach
for your application, you can convert VAX floating-point binary
data in disk files to IEEE floating-point formats before moving the
application to an I64 system.