
1: README for libm-test math test suite 2: ==================================== 3: 4: The libm-test math test suite tests a number of function points of 5: math functions in the GNU C library. The following sections contain a 6: brief overview. Please note that the test drivers and the Perl script 7: "gen-libm-test.pl" have some options. A full list of options is 8: available with --help (for the test drivers) and -h for 9: "gen-libm-test.pl". 10: 11: 12: What is tested? 13: =============== 14: The tests just evaluate the functions at specified points and compare 15: the results with precomputed values and the requirements of the ISO 16: C99 standard. 17: 18: Besides testing the special values mandated by IEEE 754 (infinities, 19: NaNs and minus zero), some more or less random values are tested. 20: 21: Files that are part of libm-test 22: ================================ 23: 24: The main file is "libm-test.inc". It is platform and floating point 25: format independent. The file must be preprocessed by the Perl script 26: "gen-libm-test.pl". The results are "libm-test.c" and a file 27: "libm-test-ulps.h" with platform specific deltas. 28: 29: The test drivers test-double.c, test-float.c, test-ldouble.c test the 30: normal double, float and long double implementation of libm. The test 31: drivers with an i in it (test-idouble.c, test-ifloat.c, 32: test-ildoubl.c) test the corresponding inline functions (where 33: available - otherwise they also test the real functions in libm). 34: 35: "gen-libm-test.pl" needs a platform specific files with ULPs (Units of 36: Last Precision). The file is called "libm-test-ulps" and lives in 37: platform specific sysdep directory. 38: 39: How can I generate "libm-test-ulps"? 40: ==================================== 41: 42: The test drivers have an option "-u" to output an unsorted list of all 43: epsilons that the functions have. The output can be read in directly 44: but it's better to pretty print it first. "gen-libm-test.pl" has an option 45: to generate a pretty-printed and sorted new ULPs file from the output 46: of the test drivers. 47: 48: To generate a new "libm-test-ulps" file, first remove "ULPs" file in the 49: current directory, then you can execute for example: 50: test-double -u --ignore-max-ulp=yes 51: This generates a file "ULPs" with all double ULPs in it, ignoring any 52: previous calculated ULPs. 53: Now generate the ULPs for all other formats, the tests will be appending 54: the data to the "ULPs" file. As final step run "gen-libm-test.pl" with the 55: file as input and ask to generate a pretty printed output in the file "NewUlps": 56: gen-libm-test.pl -u ULPs -n 57: 58: Now you can rename "NewUlps" to "libm-test-ulps" and move it into 59: sysdeps. 60: 61: Contents of libm-test-ulps 62: ========================== 63: Since libm-test-ulps can be generated automatically, just a few 64: notes. The file contains lines for single tests, like: 65: Test "cos (pi/2) == 0": 66: float: 1 67: 68: and lines for maximal errors of single functions, like: 69: Function "yn": 70: idouble: 6.0000 71: 72: The keywords are float, ifloat, double, idouble, ldouble and ildouble 73: (the prefix i stands for inline). You can also specify known 74: failures, e.g.: 75: 76: Test "cos (pi/2) == 0": 77: float: 1 78: float: fail 79: 80: Adding tests to libm-test.inc 81: ============================= 82: 83: The tests are evaluated by a set of special test macros. The macros 84: start with "TEST_" followed by a specification the input values, an 85: underscore and a specification of the output values. As an example, 86: the test macro for a function with input of type FLOAT (FLOAT is 87: either float, double, long double) and output of type FLOAT is 88: "TEST_f_f". The macro's parameter are the name of the function, the 89: input parameter, output parameter and optionally one exception 90: parameter. 91: 92: The accepted parameter types are: 93: - "f" for FLOAT 94: - "b" for boolean - just tests if the output parameter evaluates to 0 95: or 1 (only for output). 96: - "c" for complex. This parameter needs two values, first the real, 97: then the imaginary part. 98: - "i" for int. 99: - "l" for long int. 100: - "L" for long long int. 101: - "F" for the address of a FLOAT (only as input parameter) 102: - "I" for the address of an int (only as input parameter) 103: 104: Some functions need special handling. For example gamma sets the 105: global variable signgam and frexp takes an argument to &int. This 106: special treatment is coded in "gen-libm-test.pl" and used while 107: parsing "libm-test.inc".