1 1.1 ross 2 1.1 ross TestFloat Release 2a Source Documentation 3 1.1 ross 4 1.1 ross John R. Hauser 5 1.1 ross 1998 December 16 6 1.1 ross 7 1.1 ross 8 1.1 ross ------------------------------------------------------------------------------- 9 1.1 ross Introduction 10 1.1 ross 11 1.1 ross TestFloat is a program for testing that a floating-point implementation 12 1.1 ross conforms to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. 13 1.1 ross All standard operations supported by the system can be tested, except for 14 1.1 ross conversions to and from decimal. Any of the following machine formats can 15 1.1 ross be tested: single precision, double precision, extended double precision, 16 1.1 ross and/or quadruple precision. Testing extended double-precision or quadruple- 17 1.1 ross precision formats requires a C compiler that supports 64-bit integer 18 1.1 ross arithmetic. 19 1.1 ross 20 1.1 ross This document gives information needed for compiling and/or porting 21 1.1 ross TestFloat. 22 1.1 ross 23 1.1 ross The source code for TestFloat is intended to be relatively machine- 24 1.1 ross independent. TestFloat is written in C, and should be compilable using 25 1.1 ross any ISO/ANSI C compiler. At the time of this writing, the program has 26 1.1 ross been successfully compiled using the GNU C Compiler (`gcc') for several 27 1.1 ross platforms. Because ISO/ANSI C does not provide access to some features 28 1.1 ross of IEC/IEEE floating-point such as the exception flags, porting TestFloat 29 1.1 ross unfortunately involves some machine-dependent coding. 30 1.1 ross 31 1.1 ross TestFloat depends on SoftFloat, which is a software implementation of 32 1.1 ross floating-point that conforms to the IEC/IEEE Standard. SoftFloat is not 33 1.1 ross included with the TestFloat sources. It can be obtained from the Web 34 1.1 ross page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/SoftFloat.html'. 35 1.1 ross 36 1.1 ross In addition to a program for testing a machine's floating-point, the 37 1.1 ross TestFloat package includes a variant for testing SoftFloat called 38 1.1 ross `testsoftfloat'. The sources for both programs are intermixed, and both are 39 1.1 ross described here. 40 1.1 ross 41 1.1 ross The first release of TestFloat (Release 1) was called _FloatTest_. The old 42 1.1 ross name has been obsolete for some time. 43 1.1 ross 44 1.1 ross 45 1.1 ross ------------------------------------------------------------------------------- 46 1.1 ross Limitations 47 1.1 ross 48 1.1 ross TestFloat as written requires an ISO/ANSI-style C compiler. No attempt has 49 1.2 christos been made to accommodate compilers that are not ISO-conformant. Older ``K&R- 50 1.1 ross style'' compilers are not adequate for compiling TestFloat. All testing I 51 1.1 ross have done so far has been with the GNU C Compiler. Compilation with other 52 1.1 ross compilers should be possible but has not been tested. 53 1.1 ross 54 1.1 ross The TestFloat sources assume that source code file names can be longer than 55 1.1 ross 8 characters. In order to compile under an MS-DOS-style system, many of the 56 1.1 ross source files will need to be renamed, and the source and makefiles edited 57 1.1 ross appropriately. Once compiled, the TestFloat program does not depend on the 58 1.1 ross existence of long file names. 59 1.1 ross 60 1.1 ross The underlying machine is assumed to be binary with a word size that is a 61 1.1 ross power of 2. Bytes are 8 bits. Testing of extended double-precision and 62 1.1 ross quadruple-precision formats depends on the C compiler implementing a 64-bit 63 1.1 ross integer type. If the largest integer type supported by the C compiler is 64 1.1 ross 32 bits, only single- and double-precision operations can be tested. 65 1.1 ross 66 1.1 ross 67 1.1 ross ------------------------------------------------------------------------------- 68 1.1 ross Contents 69 1.1 ross 70 1.1 ross Introduction 71 1.1 ross Limitations 72 1.1 ross Contents 73 1.1 ross Legal Notice 74 1.1 ross TestFloat Source Directory Structure 75 1.1 ross Target-Independent Modules 76 1.1 ross Target-Specific Modules 77 1.1 ross Target-Specific Header Files 78 1.1 ross processors/*.h 79 1.1 ross testfloat/*/milieu.h 80 1.1 ross Target-Specific Floating-Point Subroutines 81 1.1 ross Steps to Creating the TestFloat Executables 82 1.1 ross Improving the Random Number Generator 83 1.1 ross Contact Information 84 1.1 ross 85 1.1 ross 86 1.1 ross 87 1.1 ross ------------------------------------------------------------------------------- 88 1.1 ross Legal Notice 89 1.1 ross 90 1.1 ross TestFloat was written by John R. Hauser. 91 1.1 ross 92 1.1 ross THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 93 1.1 ross has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 94 1.1 ross TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 95 1.1 ross PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 96 1.1 ross AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 97 1.1 ross 98 1.1 ross 99 1.1 ross ------------------------------------------------------------------------------- 100 1.1 ross TestFloat Source Directory Structure 101 1.1 ross 102 1.1 ross Because TestFloat is targeted to multiple platforms, its source code 103 1.1 ross is slightly scattered between target-specific and target-independent 104 1.1 ross directories and files. The directory structure is as follows: 105 1.1 ross 106 1.1 ross processors 107 1.1 ross testfloat 108 1.1 ross templates 109 1.1 ross 386-Win32-gcc 110 1.1 ross SPARC-Solaris-gcc 111 1.1 ross 112 1.1 ross The two topmost directories and their contents are: 113 1.1 ross 114 1.1 ross testfloat - Most of the source code needed for TestFloat. 115 1.1 ross processors - Target-specific header files that are not specific to 116 1.1 ross TestFloat. 117 1.1 ross 118 1.1 ross Within the `testfloat' directory are subdirectories for each of the 119 1.1 ross targeted platforms. The TestFloat source code is distributed with targets 120 1.1 ross `386-Win32-gcc' and `SPARC-Solaris-gcc' (and perhaps others) already 121 1.1 ross prepared. These can be used as examples for porting to new targets. Source 122 1.1 ross files that are not within these target-specific subdirectories are intended 123 1.1 ross to be target-independent. 124 1.1 ross 125 1.1 ross The naming convention used for the target-specific directories is 126 1.1 ross `<processor>-<executable-type>-<compiler>'. The names of the supplied 127 1.1 ross target directories should be interpreted as follows: 128 1.1 ross 129 1.1 ross <processor>: 130 1.1 ross 386 - Intel 386-compatible processor. 131 1.1 ross SPARC - SPARC processor (as used by Sun machines). 132 1.1 ross <executable-type>: 133 1.1 ross Win32 - Microsoft Win32 executable. 134 1.1 ross Solaris - Sun Solaris executable. 135 1.1 ross <compiler>: 136 1.1 ross gcc - GNU C Compiler. 137 1.1 ross 138 1.1 ross You do not need to maintain this convention if you do not want to. 139 1.1 ross 140 1.1 ross Alongside the supplied target-specific directories there is a `templates' 141 1.1 ross directory containing a set of ``generic'' target-specific source files. 142 1.1 ross A new target directory can be created by copying the `templates' directory 143 1.1 ross and editing the files inside. (Complete instructions for porting TestFloat 144 1.1 ross to a new target are in the section _Steps_to_Creating_the_TestFloat_ 145 1.1 ross _Executables_.) Note that the `templates' directory will not work as a 146 1.1 ross target directory without some editing. To avoid confusion, it would be wise 147 1.1 ross to refrain from editing the files inside `templates' directly. 148 1.1 ross 149 1.1 ross In addition to the distributed sources, TestFloat depends on the existence 150 1.1 ross of an appropriately-compiled SoftFloat binary and the corresponding header 151 1.1 ross file `softfloat.h'. SoftFloat is not included with the TestFloat sources. 152 1.1 ross It can be obtained from the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ 153 1.1 ross arithmetic/SoftFloat.html'. 154 1.1 ross 155 1.1 ross As distributed, the makefiles for TestFloat assume the existence of three 156 1.1 ross sibling directories: 157 1.1 ross 158 1.1 ross processors 159 1.1 ross softfloat 160 1.1 ross testfloat 161 1.1 ross 162 1.1 ross Only the `processors' and `testfloat' directories are included in the 163 1.1 ross TestFloat package. The `softfloat' directory is assumed to contain a 164 1.1 ross target-specific subdirectory within which the SoftFloat header file and 165 1.1 ross compiled binary can be found. (See the source documentation accompanying 166 1.1 ross SoftFloat.) The `processors' directory distributed with TestFloat is 167 1.1 ross intended to be identical to that included with the SoftFloat source. 168 1.1 ross 169 1.1 ross These are the defaults, but other organizations of the sources are possible. 170 1.1 ross The TestFloat makefiles and `milieu.h' files (see below) are easily edited 171 1.2 christos to accommodate other arrangements. 172 1.1 ross 173 1.1 ross 174 1.1 ross ------------------------------------------------------------------------------- 175 1.1 ross Target-Independent Modules 176 1.1 ross 177 1.1 ross The TestFloat program is composed of a number of modules, some target- 178 1.1 ross specific and some target-independent. The target-independent modules are as 179 1.1 ross follows: 180 1.1 ross 181 1.1 ross -- The `fail' module provides a common routine for writing an error message 182 1.1 ross and aborting. 183 1.1 ross 184 1.1 ross -- The `random' module generates random integer values. 185 1.1 ross 186 1.1 ross -- The `writeHex' module defines routines for writing the various types in 187 1.1 ross the hexadecimal form used by TestFloat. 188 1.1 ross 189 1.1 ross -- The `testCases' module generates test cases for the various types. 190 1.1 ross 191 1.1 ross -- The `testLoops' module contains various routines for exercising two 192 1.1 ross implementations of a function and reporting any differences observed. 193 1.1 ross 194 1.1 ross -- The `slowfloat' module provides the simple floating-point implementation 195 1.1 ross used by `testsoftfloat' for comparing against SoftFloat. The heart 196 1.1 ross of `slowfloat' is found in either `slowfloat-32' or `slowfloat-64', 197 1.1 ross depending on whether the `BITS64' macro is defined. 198 1.1 ross 199 1.1 ross -- The `systfloat' module gives a SoftFloat-like interface to the machine's 200 1.1 ross floating-point. 201 1.1 ross 202 1.1 ross -- The `testFunction' module implements `testfloat's main loop for testing a 203 1.1 ross function for all of the relevant rounding modes and rounding precisions. 204 1.1 ross (The `testsoftfloat' program contains its own version of this code.) 205 1.1 ross 206 1.1 ross -- The `testfloat' and `testsoftfloat' modules are the main modules for the 207 1.1 ross `testfloat' and `testsoftfloat' programs. 208 1.1 ross 209 1.1 ross Except possibly for `systfloat', these modules should not need to be 210 1.1 ross modified. 211 1.1 ross 212 1.1 ross The `systfloat' module uses the floating-point operations of the C language 213 1.1 ross to access a machine's floating-point. Unfortunately, some IEC/IEEE 214 1.1 ross floating-point operations are not accessible within ISO/ANSI C. The 215 1.1 ross following machine functions cannot be tested unless an alternate `systfloat' 216 1.1 ross module is provided: 217 1.1 ross 218 1.1 ross <float>_to_int32 (rounded according to rounding mode) 219 1.1 ross <float>_to_int64 (rounded according to rounding mode) 220 1.1 ross <float>_round_to_int 221 1.1 ross <float>_rem 222 1.1 ross <float>_sqrt, except float64_sqrt 223 1.1 ross <float>_eq_signaling 224 1.1 ross <float>_le_quiet 225 1.1 ross <float>_lt_quiet 226 1.1 ross 227 1.1 ross The `-list' option to `testfloat' will show the operations the program is 228 1.1 ross prepared to test. The section _Target-Specific_Floating-Point_Subroutines_ 229 1.1 ross later in this document explains how to create a target-specific `systfloat' 230 1.1 ross module to change the set of testable functions. 231 1.1 ross 232 1.1 ross 233 1.1 ross ------------------------------------------------------------------------------- 234 1.1 ross Target-Specific Modules 235 1.1 ross 236 1.1 ross No target-specific modules are needed for `testsoftfloat'. 237 1.1 ross 238 1.1 ross The `testfloat' program uses two target-specific modules: 239 1.1 ross 240 1.1 ross -- The `systmodes' module defines functions for setting the modes 241 1.1 ross controlling the system's floating-point, including the rounding mode and 242 1.1 ross the rounding precision for extended double precision. 243 1.1 ross 244 1.1 ross -- The `systflags' module provides a function for clearing and examining the 245 1.1 ross system's floating-point exception flags. 246 1.1 ross 247 1.1 ross These modules must be supplied for each target. They can be implemented in 248 1.1 ross any way desired, so long as all is reflected in the target's makefile. For 249 1.1 ross the targets that come with the distributed source, each of these modules is 250 1.1 ross implemented as a single assembly language or C language source file. 251 1.1 ross 252 1.1 ross 253 1.1 ross ------------------------------------------------------------------------------- 254 1.1 ross Target-Specific Header Files 255 1.1 ross 256 1.1 ross The purpose of the two target-specific header files is detailed below. 257 1.1 ross In the following, the `*' symbol is used in place of the name of a specific 258 1.1 ross target, such as `386-Win32-gcc' or `SPARC-Solaris-gcc', or in place of some 259 1.1 ross other text as explained below. 260 1.1 ross 261 1.1 ross - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 262 1.1 ross processors/*.h 263 1.1 ross 264 1.1 ross The target-specific `processors' header file defines integer types 265 1.1 ross of various sizes, and also defines certain C preprocessor macros that 266 1.1 ross characterize the target. The two examples supplied are `386-gcc.h' and 267 1.1 ross `SPARC-gcc.h'. The naming convention used for processor header files is 268 1.1 ross `<processor>-<compiler>.h'. The `processors' header file used to compile 269 1.1 ross TestFloat should be the same as that used to compile SoftFloat. 270 1.1 ross 271 1.1 ross If 64-bit integers are supported by the compiler, the macro name `BITS64' 272 1.1 ross should be defined here along with the corresponding 64-bit integer 273 1.1 ross types. In addition, the function-like macro `LIT64' must be defined for 274 1.1 ross constructing 64-bit integer literals (constants). The `LIT64' macro is used 275 1.1 ross consistently in the TestFloat code to annotate 64-bit literals. 276 1.1 ross 277 1.1 ross If an inlining attribute (such as an `inline' keyword) is provided by the 278 1.1 ross compiler, the macro `INLINE' should be defined to the appropriate keyword. 279 1.1 ross If not, `INLINE' can be set to the keyword `static'. The `INLINE' macro 280 1.1 ross appears in the TestFloat source code before every function that should be 281 1.1 ross inlined by the compiler. 282 1.1 ross 283 1.1 ross For maximum flexibility, the TestFloat source files do not include the 284 1.1 ross `processors' header file directly; rather, this file is included by the 285 1.1 ross target-specific `milieu.h' header, and `milieu.h' is included by the source 286 1.1 ross files. 287 1.1 ross 288 1.1 ross - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 289 1.1 ross testfloat/*/milieu.h 290 1.1 ross 291 1.1 ross The `milieu.h' header file provides declarations that are needed to 292 1.1 ross compile TestFloat. In particular, it is through this header file that 293 1.1 ross the appropriate `processors' header is included to characterize the target 294 1.1 ross processor. In addition, deviations from ISO/ANSI C by the compiler (such as 295 1.1 ross names not properly declared in system header files) are corrected in this 296 1.1 ross header if possible. 297 1.1 ross 298 1.1 ross If the preprocessor macro `BITS64' is defined in the `processors' header 299 1.1 ross file but only the 32-bit version of SoftFloat is actually used, the `BITS64' 300 1.1 ross macro should be undefined here after the `processors' header has defined it. 301 1.1 ross 302 1.1 ross If the C compiler implements the `long double' floating-point type of C 303 1.1 ross as extended double precision, then `LONG_DOUBLE_IS_FLOATX80' should be 304 1.1 ross defined here. Alternatively, if the C `long double' type is implemented as 305 1.1 ross quadruple precision, `LONG_DOUBLE_IS_FLOAT128' should be defined. At most 306 1.1 ross one of these macros should be defined. A C compiler is allowed to implement 307 1.1 ross `long double' the same as `double', in which case neither of these macros 308 1.1 ross should be defined. 309 1.1 ross 310 1.1 ross - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 311 1.1 ross 312 1.1 ross 313 1.1 ross ------------------------------------------------------------------------------- 314 1.1 ross Target-Specific Floating-Point Subroutines 315 1.1 ross 316 1.1 ross This section applies only to `testfloat' and not to `testsoftfloat'. 317 1.1 ross 318 1.1 ross By default, TestFloat tests a machine's floating-point by testing the 319 1.1 ross floating-point operations of the C language. Unfortunately, some IEC/IEEE 320 1.1 ross floating-point operations are not defined within ISO/ANSI C. If a machine 321 1.1 ross implements such ``non-C'' operations, target-specific subroutines for 322 1.1 ross the operations can be supplied to allow TestFloat to test these machine 323 1.1 ross features. Typically, such subroutines will need to be written in assembly 324 1.1 ross language, although equivalent functions can sometimes be found among the 325 1.1 ross system's software libraries. 326 1.1 ross 327 1.1 ross The following machine functions cannot be tested by TestFloat unless target- 328 1.1 ross specific subroutines are supplied for them: 329 1.1 ross 330 1.1 ross <float>_to_int32 (rounded according to rounding mode) 331 1.1 ross <float>_to_int64 (rounded according to rounding mode) 332 1.1 ross <float>_round_to_int 333 1.1 ross <float>_rem 334 1.1 ross <float>_sqrt, except float64_sqrt 335 1.1 ross <float>_eq_signaling 336 1.1 ross <float>_le_quiet 337 1.1 ross <float>_lt_quiet 338 1.1 ross 339 1.1 ross In addition to these, none of the `floatx80' functions can be tested by 340 1.1 ross default if the C `long double' type is something other than extended double 341 1.1 ross precision; and likewise, none of the `float128' functions can be tested by 342 1.1 ross default if `long double' is not quadruple precision. Since `long double' 343 1.1 ross cannot be both extended double precision and quadruple precision at the 344 1.1 ross same time, at least one of these types cannot be tested by TestFloat without 345 1.1 ross appropriate subroutines being supplied for that type. (On the other hand, 346 1.1 ross few systems implement _both_ extended double-precision and quadruple- 347 1.1 ross precision floating-point; and unless a system does implement both, it does 348 1.1 ross not need both tested.) 349 1.1 ross 350 1.1 ross Note that the `-list' option to `testfloat' will show the operations 351 1.1 ross TestFloat is prepared to test. 352 1.1 ross 353 1.1 ross TestFloat's `systfloat' module supplies the system version of the functions 354 1.1 ross to be tested. The names of the `systfloat' subroutines are the same as the 355 1.1 ross function names used as arguments to the `testfloat' command but with `syst_' 356 1.1 ross prefixed--thus, for example, `syst_float32_add' and `syst_int32_to_float32'. 357 1.1 ross The default `systfloat' module maps these system functions to the standard 358 1.1 ross C operations; so `syst_float32_add', for example, is implemented using the 359 1.1 ross C `+' operation for the single-precision `float' type. For each system 360 1.1 ross function supplied by `systfloat', a corresponding `SYST_<function>' 361 1.1 ross preprocessor macro is defined in `systfloat.h' to indicate that the function 362 1.1 ross exists to be tested (e.g., `SYST_FLOAT32_ADD'). The `systfloat.h' header 363 1.1 ross file also declares function prototypes for the `systfloat' functions. 364 1.1 ross 365 1.1 ross (The `systfloat.h' file that comes with the TestFloat package declares 366 1.1 ross prototypes for all of the possible `systfloat' functions, whether defined in 367 1.1 ross `systfloat' or not. There is no penalty for declaring a function prototype 368 1.1 ross that is never used.) 369 1.1 ross 370 1.1 ross A target-specific version of the `systfloat' module can easily be created to 371 1.1 ross replace the generic one. This in fact has been done for the example targets 372 1.1 ross `386-Win32-gcc' and `SPARC-Solaris-gcc'. For each target, an assembly 373 1.1 ross language `systfloat.S' has been created in the target directory along with 374 1.1 ross a corresponding `systfloat.h' header file defining the `SYST_<function>' 375 1.1 ross macros for the functions implemented. The makefiles of the targets have 376 1.1 ross been edited to use these target-specific versions of `systfloat' rather than 377 1.1 ross the generic one. 378 1.1 ross 379 1.1 ross The `systfloat' modules of the example targets have been written entirely 380 1.1 ross in assembly language in order to bypass any peculiarities of the C compiler. 381 1.1 ross Although this is probably a good idea, it is certainly not required. 382 1.1 ross 383 1.1 ross 384 1.1 ross ------------------------------------------------------------------------------- 385 1.1 ross Steps to Creating the TestFloat Executables 386 1.1 ross 387 1.1 ross Porting and/or compiling TestFloat involves the following steps: 388 1.1 ross 389 1.1 ross 1. Port SoftFloat and create a SoftFloat binary. (Refer to the 390 1.1 ross documentation accompanying SoftFloat.) 391 1.1 ross 392 1.1 ross 2. If one does not already exist, create an appropriate target-specific 393 1.1 ross subdirectory under `testfloat' by copying the given `templates' 394 1.1 ross directory. The remaining steps occur within the target-specific 395 1.1 ross subdirectory. 396 1.1 ross 397 1.1 ross 3. Edit the files `milieu.h' and `Makefile' to reflect the current 398 1.1 ross environment. 399 1.1 ross 400 1.1 ross 4. Make `testsoftfloat' by executing `make testsoftfloat' (or `make 401 1.1 ross testsoftfloat.exe', or whatever the `testsoftfloat' executable is 402 1.1 ross called). Verify that SoftFloat is working correctly by testing it with 403 1.1 ross `testsoftfloat'. 404 1.1 ross 405 1.1 ross If you only wanted `testsoftfloat', you are done. The steps for `testfloat' 406 1.1 ross continue: 407 1.1 ross 408 1.1 ross 5. In the target-specific subdirectory, implement the `systmodes' and 409 1.1 ross `systflags' modules. (The `syst_float_set_rounding_precision' function 410 1.1 ross need not do anything if the system does not support extended double 411 1.1 ross precision.) 412 1.1 ross 413 1.1 ross 6. If the target machine supports standard floating-point functions that are 414 1.1 ross not accessible within ISO/ANSI C, or if the C compiler cannot be trusted 415 1.1 ross to use the machine's floating-point directly, create a target-specific 416 1.1 ross `systfloat' module. 417 1.1 ross 418 1.1 ross 7. In the target-specific subdirectory, execute `make'. 419 1.1 ross 420 1.1 ross 421 1.1 ross ------------------------------------------------------------------------------- 422 1.1 ross Improving the Random Number Generator 423 1.1 ross 424 1.1 ross If you are serious about using TestFloat for testing floating-point, you 425 1.1 ross should consider replacing the supplied `random.c' with a better target- 426 1.1 ross specific one. The standard C `rand' function is rather poor on some 427 1.1 ross systems, and consequently `random.c' has been written to assume very little 428 1.1 ross about the quality of `rand'. As a result, the `rand' function is called 429 1.1 ross more frequently than it might need to be, shortening the time before 430 1.1 ross the random number generator repeats, and possibly wasting time as well. 431 1.1 ross If `rand' is better on your system, or if another better random number 432 1.1 ross generator is available (such as `rand48' on most Unix systems), TestFloat 433 1.1 ross can be improved by overriding the given `random.c' with a target-specific 434 1.1 ross one. 435 1.1 ross 436 1.1 ross 437 1.1 ross ------------------------------------------------------------------------------- 438 1.1 ross Contact Information 439 1.1 ross 440 1.1 ross At the time of this writing, the most up-to-date information about 441 1.1 ross TestFloat and the latest release can be found at the Web page `http:// 442 1.1 ross HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'. 443 1.1 ross 444 1.1 ross 445