`testfloat`

John R. Hauser

2018 January 20

The `testfloat`

program tests an implementation of floating-point
arithmetic for conformity to the IEEE Standard for Binary Floating-Point
Arithmetic.
`testfloat`

is part of the Berkeley TestFloat package, a small
collection of programs for performing such tests.
For general information about TestFloat, see file
`TestFloat-general.html`

The `testfloat`

program is an all-in-one tool for testing
floating-point arithmetic.
It generates test operand values, invokes a floating-point operation with the
generated operands, and examines the corresponding computed results, reporting
unexpected results as likely errors.
While the processes of generating inputs and examining results are generic, a
particular build of `testfloat`

is limited to testing only the one
implementation of floating-point it has been compiled to invoke.
For example, while one instance of `testfloat`

might be compiled to
execute a computer’s hardware instruction for floating-point addition, a
different version might be compiled to call a subroutine called
`myAddFloat`

that is linked into the `testfloat`

program.
To test a new implementation of floating-point (a new set of machine
instructions or a new set of subroutines), a new `testfloat`

must be
compiled containing the code needed to invoke the new floating-point.

The default build of `testfloat`

assumes that C types
`float`

and `double`

are `+`

, `-`

,
`*`

, `/`

, type conversions, etc.
This tests the floating-point arithmetic seen by C programs.
Depending on the compiler and the options selected during compilation, this may
or may not be the same as the computer’s floating-point hardware, if any.

The `testfloat`

program will ordinarily test an operation for all
five rounding modes defined by the IEEE Floating-Point Standard, one after the
other, plus possibly a sixth mode, *round to odd* (depending on the
options selected when `testfloat`

was compiled).
If the rounding mode is not supposed to have any affect on the
results—for instance, some operations do not require rounding—only
the nearest/even rounding mode is checked.
For double-extended-precision operations affected by rounding precision
control, `testfloat`

also tests all three rounding precision modes,
one after the other.
Testing can be limited to a single rounding mode and/or rounding precision with
appropriate command-line options.

For more about the operation of `testfloat`

and how to interpret its
output, refer to
`TestFloat-general.html`

The `testfloat`

program is executed as a command with this syntax:

Square brackets (testfloat [<option>...] <function>

`[ ]`

) denote optional arguments,
`<`*option*>

is a supported option, and
`<`*function*>

is the name of either a testable operation
or a function set.
The available options and function sets are documented below.
The `-list`

option can be used to obtain a list of all testable
operations for a given build of `testfloat`

.
If `testfloat`

is executed without any arguments, a summary of usage
is written.
The `testfloat`

program accepts several command options.
If mutually contradictory options are given, the last one has priority.

`-help`

The `-help`

option causes a summary of program usage to be written,
after which the program exits.

`-list`

The `-list`

option causes a list of testable operations to be
written, after which the program exits.
An operation is testable by `testfloat`

if the program knows some
way to invoke the operation.

`-seed <`*num*>

The `-seed`

option sets the seed for the pseudo-random number
generator used for generating test cases.
The argument to `-seed`

is a nonnegative integer.
Executing the same compiled `testfloat`

program with the same
arguments (including the same pseudo-random number seed) should always perform
the same sequence of tests, whereas changing the pseudo-random number seed
should result in a different sequence of tests.
The default seed number

`-level <`*num*>

The `-level`

option sets the level of testing.
The argument to `-level`

can be either 1

`-errors <`*num*>

The `-errors`

option instructs `testfloat`

to report no
more than the specified number of errors for any combination of operation,
rounding mode, etc.
The argument to `-errors`

must be a nonnegative decimal integer.
Once the specified number of error reports has been generated,
`testfloat`

ends the current test and begins the next one, if any.
The default is `-errors`

`20`

Against intuition, `-errors`

`0`

`testfloat`

to report every error it finds.

`-errorstop`

The `-errorstop`

option causes the program to exit after the first
operation for which any errors are reported.

`-forever`

The `-forever`

option causes a single operation to be repeatedly
tested.
Only one rounding mode and/or rounding precision can be tested in a single
execution.
If not specified, the rounding mode defaults to nearest/even.
For

`-checkNaNs`

The `-checkNaNs`

option causes `testfloat`

to verify the
bitwise correctness of NaN results.
In order for this option to be sensible, `testfloat`

must have been
compiled so that its internal reference implementation of floating-point
(Berkeley SoftFloat) generates the proper NaN results for the system being
tested.

`-checkInvInts`

The `-checkInvInts`

option causes `testfloat`

to verify
the bitwise correctness of integer results of invalid operations.
In order for this option to be sensible, `testfloat`

must have been
compiled so that its internal reference implementation of floating-point
(Berkeley SoftFloat) generates the proper integer results for the system being
tested.

`-checkAll`

Enables both `-checkNaNs`

and `-checkInvInts`

.

`-precision32, -precision64, -precision80`

For `-precision32`

option restricts
testing to only the cases in which the rounding precision is
`-precision64`

fixes the rounding precision to
`-precision80`

fixes the rounding precision to the full

The precision-control options may not be supported at all if no double-extended-precision operations are testable.

`-rnear_even, -rnear_maxMag, -rminMag, -rmin, -rmax, -rodd`

The `-rnear_even`

option restricts testing to only the cases in
which the rounding mode is nearest/even.
The other rounding mode choices are not tested.
Likewise, `-rnear_maxMag`

forces rounding to nearest/maximum
magnitude (nearest-away), `-rminMag`

forces rounding to minimum
magnitude (toward zero), `-rmin`

forces rounding to minimum (down,
toward negative infinity), `-rmax`

forces rounding to maximum (up,
toward positive infinity), and `-rodd`

, if supported, forces
rounding to odd.
These options are ignored for operations that are exact and thus do not round,
or that have the rounding mode included in the function name (such as
`f32_to_i32_r_near_maxMag`

).

`-tininessbefore, -tininessafter`

The `-tininessbefore`

option indicates that the floating-point
implementation being tested detects tininess on underflow before rounding.
The `-tininessafter`

option indicates that tininess is detected
after rounding.
The `testfloat`

program alters its expectations accordingly.
These options override the default selected when `testfloat`

was
compiled.
Choosing the wrong one of these two options should cause error reports for some
(but not all) operations.

Just as `testfloat`

can test an operation for all five or six
rounding modes in sequence, multiple operations can be tested with a single
execution of `testfloat`

.
Two sets are recognized: `-all1`

and `-all2`

.
The set `-all1`

is all one-operand operations, while
`-all2`

is all two-operand operations.
A function set is used in place of an operation name in the
`testfloat`

command line, such as

testfloat [<option>...] -all1