# Berkeley TestFloat Release 3e: `testfloat`

John R. Hauser
2018 January 20

## Overview

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 32-bit and 64-bit binary floating-point types conforming to the IEEE Standard, and tests the C operations of `+`, `-`, `*`, `/`, 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`.

## Command Syntax

The `testfloat` program is executed as a command with this syntax:

>     testfloat [<option>...] <function>

Square brackets (`[ ]`) 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.

## Options

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 is 1.

### `-level <num>`

The `-level` option sets the level of testing. The argument to `-level` can be either 1 or 2. The default is level 1. Level 2 performs many more tests than level 1 and thus can reveal bugs not found by level 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` causes `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 80-bit double-extended-precision operations, the rounding precision defaults to full double-extended precision. The testing level is set to 2 by this option.

### `-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 80-bit double-extended-precision operations affected by rounding precision control, the `-precision32` option restricts testing to only the cases in which the rounding precision is 32 bits, equivalent to 32-bit single-precision. The other rounding precision choices are not tested. Likewise, `-precision64` fixes the rounding precision to 64 bits, equivalent to 64-bit double-precision, and `-precision80` fixes the rounding precision to the full 80 bits of the double-extended-precision format. All these options are ignored for operations not affected by rounding precision control.

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.

## Function Sets

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