1999-10-18  Andreas Jaeger  <aj@suse.de>

	Added improved math testsuite:
	* math/libm-test.inc: New file, contains all tests from
	libm-test.c but in a different form.
	* math/libm-test.c: Removed.
	* sysdeps/generic/libm-test-ulps: New file: Fallback ulps file.
	* math/gen-libm-test.pl: New file: Preprocessor.
	* math/test-double.c: Adopted to new testsuite.
	* math/test-idouble.c: Likewise.
	* math/test-float.c: Likewise.
	* math/test-ifloat.c: Likewise.
	* math/test-ldouble.c: Likewise.
	* math/test-ildoubl.c: Likewise.
	* math/Makefile: Added rules to generate new suite.
This commit is contained in:
Ulrich Drepper 1999-10-19 06:29:27 +00:00
parent 4dba81eafc
commit 8847214f23
13 changed files with 5555 additions and 6355 deletions

View File

@ -1,3 +1,19 @@
1999-10-18 Andreas Jaeger <aj@suse.de>
Added improved math testsuite:
* math/libm-test.inc: New file, contains all tests from
libm-test.c but in a different form.
* math/libm-test.c: Removed.
* sysdeps/generic/libm-test-ulps: New file: Fallback ulps file.
* math/gen-libm-test.pl: New file: Preprocessor.
* math/test-double.c: Adopted to new testsuite.
* math/test-idouble.c: Likewise.
* math/test-float.c: Likewise.
* math/test-ifloat.c: Likewise.
* math/test-ldouble.c: Likewise.
* math/test-ildoubl.c: Likewise.
* math/Makefile: Added rules to generate new suite.
1999-10-18 Ulrich Drepper <drepper@cygnus.com>
* inet/rcmd.c (iruserok2): Initialize isbad to -1 [PR libc/1405].

View File

@ -74,14 +74,38 @@ routines = $(calls) $(calls:=f) $(long-c-$(long-double-fcts))
long-c-yes = $(calls:=l)
distribute += $(long-c-yes:=.c)
include ../Makeconfig
# Rules for the test suite.
tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \
test-ifloat test-idouble test-matherr test-fenv \
atest-exp atest-sincos atest-exp2 basic-test
tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test
# We do the `long double' tests only if this data type is available and
# distinct from `double'.
test-longdouble-yes = test-ldouble test-ildoubl
ifneq (no,$(PERL))
libm-tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \
test-ifloat test-idouble
libm-tests.o = $(addsuffix .o,$(libm-tests))
tests += $(libm-tests)
libm-tests-generated = libm-test-ulps.h libm-test.c libm-test.stmp
generated += $(libm-tests-generated)
ulps-file= $(firstword $(wildcard $(config-sysdirs:%=$(..)%/libm-test-ulps)))
$(objpfx)libm-test.stmp: $(ulps-file) libm-test.inc gen-libm-test.pl
$(PERL) gen-libm-test.pl -u $< -o $(objdir)/math/
@echo > $@
$(objpfx)test-float.o: $(objpfx)libm-test.stmp
$(objpfx)test-ifloat.o: $(objpfx)libm-test.stmp
$(objpfx)test-double.o: $(objpfx)libm-test.stmp
$(objpfx)test-idouble.o: $(objpfx)libm-test.stmp
$(objpfx)test-ldouble.o: $(objpfx)libm-test.stmp
$(objpfx)test-ildoubl.o: $(objpfx)libm-test.stmp
endif
CFLAGS-test-float.c = -fno-inline -ffloat-store
CFLAGS-test-double.c = -fno-inline -ffloat-store
CFLAGS-test-ldouble.c = -fno-inline -ffloat-store
@ -100,7 +124,7 @@ LDLIBS-atest-exp = math/libm
LDLIBS-atest-sincos = math/libm
LDLIBS-atest-exp2 = math/libm
distribute += libm-test.c
distribute += libm-test.inc gen-libm-test.pl
# The -lieee module sets the _LIB_VERSION_ switch to IEEE mode

606
math/gen-libm-test.pl Executable file
View File

@ -0,0 +1,606 @@
#!/usr/bin/perl -w
# Copyright (C) 1999 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# Contributed by Andreas Jaeger <aj@suse.de>, 1999.
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
# You should have received a copy of the GNU Library General Public
# License along with the GNU C Library; see the file COPYING.LIB. If not,
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
# This file needs to be tidied up
# Note that functions and tests share the same namespace.
use Getopt::Std;
use strict;
use vars qw ($input $output);
use vars qw (@tests @functions);
use vars qw ($count);
use vars qw (%ulps %failures);
use vars qw (%beautify);
use vars qw ($output_dir $ulps_file);
%beautify =
( "minus_zero" => "-0",
"plus_zero" => "+0",
"minus_infty" => "-inf",
"plus_infty" => "inf",
"nan_value" => "NaN",
"M_El" => "e",
"M_E2l" => "e^2",
"M_E3l" => "e^3",
"M_LOG10El", "log10(e)",
"M_PIl" => "pi",
"M_PI_34l" => "3/4 pi",
"M_PI_2l" => "pi/2",
"M_PI_4l" => "pi/4",
"M_PI_6l" => "pi/6",
"M_PI_34_LOG10El" => "3/4 pi*log10(e)",
"M_PI_LOG10El" => "pi*log10(e)",
"M_PI2_LOG10El" => "pi/2*log10(e)",
"M_PI4_LOG10El" => "pi/4*log10(e)",
"M_LOG_SQRT_PIl" => "log(sqrt(pi))",
"M_LOG_2_SQRT_PIl" => "log(2*sqrt(pi))",
"M_2_SQRT_PIl" => "2 sqrt (pi)",
"M_SQRT_PIl" => "sqrt (pi)",
"INVALID_EXCEPTION" => "invalid exception",
"DIVIDE_BY_ZERO_EXCEPTION" => "division by zero exception",
"INVALID_EXCEPTION_OK" => "invalid exception allowed",
"DIVIDE_BY_ZERO_EXCEPTION_OK" => "division by zero exception allowed",
"EXCEPTIONS_OK" => "exceptions allowed",
"IGNORE_ZERO_INF_SIGN" => "sign of zero/inf not specified",
"INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN" => "invalid exception and sign of zero/inf not specified"
);
# get Options
# Options:
# u: ulps-file
# h: help
# o: output-directory
# n: generate new ulps file
use vars qw($opt_u $opt_h $opt_o $opt_n);
getopts('u:o:nh');
$ulps_file = 'libm-test-ulps';
$output_dir = '';
if ($opt_h) {
print "Usage: generate.pl [OPTIONS]\n";
print " -h print this help, then exit\n";
print " -o DIR directory where generated files will be placed\n";
print " -n generate sorted file NewUlps from libm-test-ulps\n";
print " -u FILE input file with ulps\n";
exit 0;
}
$ulps_file = $opt_u if ($opt_u);
$output_dir = $opt_o if ($opt_o);
$input = "libm-test.inc";
$output = "${output_dir}libm-test.c";
$count = 0;
&parse_ulps ($ulps_file);
&generate_testfile ($input, $output);
&output_ulps ("${output_dir}libm-test-ulps.h");
&print_ulps_file ("${output_dir}NewUlps") if ($opt_n);
# Return a nicer representation
sub beautify {
my ($arg) = @_;
my ($tmp);
if (exists $beautify{$arg}) {
return $beautify{$arg};
}
if ($arg =~ /^-/) {
$tmp = $arg;
$tmp =~ s/^-//;
if (exists $beautify{$tmp}) {
return '-' . $beautify{$tmp};
}
}
if ($arg =~ /[0-9]L$/) {
$arg =~ s/L$//;
}
return $arg;
}
# Return a nicer representation of a complex number
sub build_complex_beautify {
my ($r, $i) = @_;
my ($str1, $str2);
$str1 = &beautify ($r);
$str2 = &beautify ($i);
if ($str2 =~ /^-/) {
$str2 =~ s/^-//;
$str1 .= ' - ' . $str2;
} else {
$str1 .= ' + ' . $str2;
}
$str1 .= ' i';
return $str1;
}
# Return name of a variable
sub get_variable {
my ($number) = @_;
return "x" if ($number == 1);
return "y" if ($number == 2);
return "z" if ($number == 3);
# return x1,x2,...
$number =-3;
return "x$number";
}
# Add a new test to internal data structures and fill in the
# ulps, failures and exception information for the C line.
sub new_test {
my ($test, $exception) = @_;
my $rest;
# Add ulp, xfail
if (exists $ulps{$test}) {
$rest = ", DELTA$count";
} else {
$rest = ', 0';
}
if (exists $failures{$test}) {
$rest .= ", FAIL$count";
} else {
$rest .= ', 0';
}
if (defined $exception) {
$rest .= ", $exception";
} else {
$rest .= ', 0';
}
$rest .= ");\n";
# We must increment here to keep @tests and count in sync
push @tests, $test;
++$count;
return $rest;
}
# Treat some functions especially.
# Currently only sincos needs extra treatment.
sub special_functions {
my ($file, $args) = @_;
my (@args, $str, $test, $cline);
@args = split /,\s*/, $args;
unless ($args[0] =~ /sincos/) {
die ("Don't know how to handle $args[0] extra.");
}
print $file " FUNC (sincos) ($args[1], &sin_res, &cos_res);\n";
$str = 'sincos (' . &beautify ($args[1]) . ', &sin_res, &cos_res)';
# handle sin
$test = $str . ' puts ' . &beautify ($args[2]) . ' in sin_res';
if ($#args == 4) {
$test .= " plus " . &beautify ($args[4]);
}
$cline = " check_float (\"$test\", sin_res, $args[2]";
$cline .= &new_test ($test, $args[4]);
print $file $cline;
# handle cos
$test = $str . ' puts ' . &beautify ($args[3]) . ' in cos_res';
$cline = " check_float (\"$test\", cos_res, $args[3]";
# only tests once for exception
$cline .= &new_test ($test, undef);
print $file $cline;
}
# Parse the arguments to TEST_x_y
sub parse_args {
my ($file, $descr, $args) = @_;
my (@args, $str, $descr_args, $descr_res, @descr);
my ($current_arg, $cline, $i);
my ($pre, $post, @special);
my ($extra_var, $call, $c_call);
if ($descr eq 'extra') {
&special_functions ($file, $args);
return;
}
($descr_args, $descr_res) = split /_/,$descr, 2;
@args = split /,\s*/, $args;
$call = "$args[0] (";
# Generate first the string that's shown to the user
$current_arg = 1;
$extra_var = 0;
@descr = split //,$descr_args;
for ($i = 0; $i <= $#descr; $i++) {
if ($i >= 1) {
$call .= ', ';
}
# FLOAT, int, long int, long long int
if ($descr[$i] =~ /f|i|l|L/) {
$call .= &beautify ($args[$current_arg]);
++$current_arg;
next;
}
# &FLOAT, &int - argument is added here
if ($descr[$i] =~ /F|I/) {
++$extra_var;
$call .= '&' . &get_variable ($extra_var);
next;
}
# complex
if ($descr[$i] eq 'c') {
$call .= &build_complex_beautify ($args[$current_arg], $args[$current_arg+1]);
$current_arg += 2;
next;
}
die ("$descr[$i] is unknown");
}
$call .= ')';
$str = "$call == ";
# Result
@descr = split //,$descr_res;
foreach (@descr) {
if ($_ =~ /f|i|l|L/) {
$str .= &beautify ($args[$current_arg]);
++$current_arg;
} elsif ($_ eq 'c') {
$str .= &build_complex_beautify ($args[$current_arg], $args[$current_arg+1]);
$current_arg += 2;
} elsif ($_ eq 'b') {
# boolean
$str .= ($args[$current_arg] == 0) ? "false" : "true";
++$current_arg;
} elsif ($_ eq '1') {
++$current_arg;
} else {
die ("$_ is unknown");
}
}
# consistency check
if ($current_arg == $#args) {
die ("wrong number of arguments")
unless ($args[$current_arg] =~ /EXCEPTION|IGNORE_ZERO_INF_SIGN/);
} elsif ($current_arg < $#args) {
die ("wrong number of arguments");
} elsif ($current_arg > ($#args+1)) {
die ("wrong number of arguments");
}
# check for exceptions
if ($current_arg <= $#args) {
$str .= " plus " . &beautify ($args[$current_arg]);
}
# Put the C program line together
# Reset some variables to start again
$current_arg = 1;
$extra_var = 0;
if (substr($descr_res,0,1) eq 'f') {
$cline = 'check_float'
} elsif (substr($descr_res,0,1) eq 'b') {
$cline = 'check_bool';
} elsif (substr($descr_res,0,1) eq 'c') {
$cline = 'check_complex';
} elsif (substr($descr_res,0,1) eq 'i') {
$cline = 'check_int';
} elsif (substr($descr_res,0,1) eq 'l') {
$cline = 'check_long';
} elsif (substr($descr_res,0,1) eq 'L') {
$cline = 'check_longlong';
}
# Special handling for some macros:
$cline .= " (\"$str\", ";
if ($args[0] =~ /fpclassify|isnormal|isfinite|signbit/) {
$c_call = "$args[0] (";
} else {
$c_call = " FUNC($args[0]) (";
}
@descr = split //,$descr_args;
for ($i=0; $i <= $#descr; $i++) {
if ($i >= 1) {
$c_call .= ', ';
}
# FLOAT, int, long int, long long int
if ($descr[$i] =~ /f|i|l|L/) {
$c_call .= $args[$current_arg];
$current_arg++;
next;
}
# &FLOAT, &int
if ($descr[$i] =~ /F|I/) {
++$extra_var;
$c_call .= '&' . &get_variable ($extra_var);
next;
}
# complex
if ($descr[$i] eq 'c') {
$c_call .= "BUILD_COMPLEX ($args[$current_arg], $args[$current_arg+1])";
$current_arg += 2;
next;
}
}
$c_call .= ')';
$cline .= "$c_call, ";
@descr = split //,$descr_res;
foreach (@descr) {
if ($_ =~ /b|f|i|l|L/ ) {
$cline .= $args[$current_arg];
$current_arg++;
} elsif ($_ eq 'c') {
$cline .= "BUILD_COMPLEX ($args[$current_arg], $args[$current_arg+1])";
$current_arg += 2;
} elsif ($_ eq '1') {
push @special, $args[$current_arg];
++$current_arg;
}
}
# Add ulp, xfail
$cline .= &new_test ($str, ($current_arg <= $#args) ? $args[$current_arg] : undef);
# special treatment for some functions
if ($args[0] eq 'frexp') {
if (defined $special[0] && $special[0] ne "IGNORE") {
my ($str) = "$call sets x to $special[0]";
$post = " check_int (\"$str\", x, $special[0]";
$post .= &new_test ($str, undef);
}
} elsif ($args[0] eq 'gamma' || $args[0] eq 'lgamma') {
$pre = " signgam = 0;\n";
if (defined $special[0] && $special[0] ne "IGNORE") {
my ($str) = "$call sets signgam to $special[0]";
$post = " check_int (\"$str\", signgam, $special[0]";
$post .= &new_test ($str, undef);
}
} elsif ($args[0] eq 'modf') {
if (defined $special[0] && $special[0] ne "IGNORE") {
my ($str) = "$call sets x to $special[0]";
$post = " check_float (\"$str\", x, $special[0]";
$post .= &new_test ($str, undef);
}
} elsif ($args[0] eq 'remquo') {
if (defined $special[0] && $special[0] ne "IGNORE") {
my ($str) = "$call sets x to $special[0]";
$post = " check_int (\"$str\", x, $special[0]";
$post .= &new_test ($str, undef);
}
}
print $file $pre if (defined $pre);
print $file " $cline\n";
print $file $post if (defined $post);
}
# Generate libm-test.c
sub generate_testfile {
my ($input, $output) = @_;
my ($lasttext);
my (@args, $i, $str);
open INPUT, $input or die ("Can't open $input: $!");
open OUTPUT, ">$output" or die ("Can't open $output: $!");
# Replace the special macros
while (<INPUT>) {
# TEST_...
if (/^\s*TEST_/) {
my ($descr, $args);
chop;
($descr, $args) = ($_ =~ /TEST_(\w+)\s*\((.*)\)/);
&parse_args (\*OUTPUT, $descr, $args);
next;
}
# START (function)
if (/START/) {
print OUTPUT " init_max_error ();\n";
next;
}
# END (function)
if (/END/) {
my ($fct, $line);
($fct) = ($_ =~ /END\s*\((.*)\)/);
$line = " print_max_error (\"$fct\", ";
if (exists $ulps{$fct}) {
$line .= "DELTA$fct";
} else {
$line .= '0';
}
if (exists $failures{$fct}) {
$line .= ", FAIL$fct";
} else {
$line .= ', 0';
}
$line .= ");\n";
print OUTPUT $line;
push @functions, $fct;
next;
}
print OUTPUT;
}
close INPUT;
close OUTPUT;
}
# Parse ulps file
sub parse_ulps {
my ($file) = @_;
my ($test, $type, $eps);
open ULP, $file or die ("Can't open $file: $!");
while (<ULP>) {
chop;
# ignore comments and empty lines
next if /^#/;
next if /^\s*$/;
if (/^Test/) {
s/^.+\"(.*)\".*$/$1/;
$test = $_;
next;
}
if (/^Function/) {
($test) = ($_ =~ /^Function\s*\"([a-zA-Z0-9_]+)\"/);
next;
}
if (/^i?(float|double|ldouble):/) {
($type, $eps) = split /\s*:\s*/,$_,2;
if ($eps eq "fail") {
$failures{$test}{$type} = 1;
} else {
$ulps{$test}{$type} = $eps;
}
next;
}
print "Skipping unknown entry: `$_'\n";
}
close ULP;
}
# Just for testing: Print all ulps
sub print_ulps {
my ($test, $type, $eps);
foreach $test (keys %ulps) {
print "$test:\n";
foreach $type (keys %{$ulps{$test}}) {
print "$test: $type $ulps{$test}{$type}\n";
}
}
}
# Clean up a floating point number
sub clean_up_number {
my ($number) = @_;
# Remove trailing zeros
$number =~ s/0+$//;
$number =~ s/\.$//;
return $number;
}
# Output a file which can be read in as ulps file.
sub print_ulps_file {
my ($file) = @_;
my ($test, $type, $eps, $fct, $last_fct);
$last_fct = '';
open NEWULP, ">$file" or die ("Can't open $file: $!");
print NEWULP "# Begin of automatic generation\n";
foreach $test (sort @tests) {
if (defined $ulps{$test} || defined $failures{$test}) {
($fct) = ($test =~ /^(\w+)\s/);
if ($fct ne $last_fct) {
$last_fct = $fct;
print NEWULP "\n# $fct\n";
}
print NEWULP "Test \"$test\":\n";
foreach $type (sort keys %{$ulps{$test}}) {
print NEWULP "$type: ", &clean_up_number ($ulps{$test}{$type}), "\n";
}
foreach $type (sort keys %{$failures{$test}}) {
print NEWULP "$type: fail\n";
}
}
}
print NEWULP "\n# Maximal error of functions:\n";
foreach $fct (sort @functions) {
if (defined $ulps{$fct} || defined $failures{$fct}) {
print NEWULP "Function \"$fct\":\n";
foreach $type (sort keys %{$ulps{$fct}}) {
print NEWULP "$type: ", &clean_up_number ($ulps{$fct}{$type}), "\n";
}
foreach $type (sort keys %{$failures{$fct}}) {
print NEWULP "$type: fail\n";
}
print NEWULP "\n";
}
}
print NEWULP "# end of automatic generation\n";
close NEWULP;
}
sub get_ulps {
my ($test, $float) = @_;
return exists $ulps{$test}{$float} ? $ulps{$test}{$float} : "0";
}
sub get_failure {
my ($test, $float) = @_;
return exists $failures{$test}{$float} ? $failures{$test}{$float} : "0";
}
# Output the defines for a single test
sub output_test {
my ($file, $test, $name) = @_;
my ($ldouble, $double, $float, $ildouble, $idouble, $ifloat);
if (exists $ulps{$test}) {
$ldouble = &get_ulps ($test, "ldouble");
$double = &get_ulps ($test, "double");
$float = &get_ulps ($test, "float");
$ildouble = &get_ulps ($test, "ildouble");
$idouble = &get_ulps ($test, "idouble");
$ifloat = &get_ulps ($test, "ifloat");
print $file "#define DELTA$name CHOOSE($ldouble, $double, $float, $ildouble, $idouble, $ifloat)\t/* $test */\n";
}
if (exists $failures{$test}) {
$ldouble = &get_failure ($test, "ldouble");
$double = &get_failure ($test, "double");
$float = &get_failure ($test, "float");
$ildouble = &get_failure ($test, "ildouble");
$idouble = &get_failure ($test, "idouble");
$ifloat = &get_failure ($test, "ifloat");
print $file "#define FAIL$name CHOOSE($ldouble, $double, $float $ildouble, $idouble, $ifloat)\t/* $test */\n";
}
}
# Print include file
sub output_ulps {
my ($file) = @_;
my ($i, $fct);
open ULP, ">$file" or die ("Can't open $file: $!");
print ULP "/* This file is automatically generated.\n";
print ULP " Don't change it - change instead the master files. */\n\n";
foreach $fct (@functions) {
output_test (\*ULP, $fct, $fct);
}
for ($i = 0; $i < $count; $i++) {
output_test (\*ULP, $tests[$i], $i);
}
close ULP;
}

File diff suppressed because it is too large Load Diff

3950
math/libm-test.inc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@arthur.pfalz.de>, 1997.
Contributed by Andreas Jaeger <aj@suse.de>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@ -18,12 +18,13 @@
Boston, MA 02111-1307, USA. */
#define FUNC(function) function
#define MATHTYPE double
#define FLOAT double
#define TEST_MSG "testing double (without inline functions)\n"
#define MATHCONST(x) x
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cdouble
#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cdouble
#define PRINTF_EXPR "e"
#define PRINTF_XEXPR "a"
#define PRINTF_NEXPR "f"
#define TEST_DOUBLE 1
#ifndef __NO_MATH_INLINES

View File

@ -1,6 +1,6 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@arthur.pfalz.de>, 1997.
Contributed by Andreas Jaeger <aj@suse.de>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@ -18,12 +18,13 @@
Boston, MA 02111-1307, USA. */
#define FUNC(function) function ## f
#define MATHTYPE float
#define FLOAT float
#define TEST_MSG "testing float (without inline functions)\n"
#define MATHCONST(x) x
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cfloat
#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cfloat
#define PRINTF_EXPR "e"
#define PRINTF_XEXPR "a"
#define PRINTF_NEXPR "f"
#define TEST_FLOAT 1
#ifndef __NO_MATH_INLINES

View File

@ -1,6 +1,6 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1997.
Contributed by Andreas Jaeger <aj@suse.de>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@ -19,12 +19,13 @@
Boston, MA 02111-1307, USA. */
#define FUNC(function) function
#define MATHTYPE double
#define FLOAT double
#define TEST_MSG "testing double (inline functions)\n"
#define MATHCONST(x) x
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cdouble
#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cinlinedouble
#define PRINTF_EXPR "e"
#define PRINTF_XEXPR "a"
#define PRINTF_NEXPR "f"
#define TEST_DOUBLE 1
#define TEST_INLINE

View File

@ -1,6 +1,6 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1997.
Contributed by Andreas Jaeger <aj@suse.de>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@ -18,12 +18,13 @@
Boston, MA 02111-1307, USA. */
#define FUNC(function) function ## f
#define MATHTYPE float
#define FLOAT float
#define TEST_MSG "testing float (inline functions)\n"
#define MATHCONST(x) x
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Cfloat
#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cinlinefloat
#define PRINTF_EXPR "e"
#define PRINTF_XEXPR "a"
#define PRINTF_NEXPR "f"
#define TEST_FLOAT 1
#define TEST_INLINE 1

View File

@ -1,6 +1,6 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1997.
Contributed by Andreas Jaeger <aj@suse.de>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@ -19,12 +19,13 @@
Boston, MA 02111-1307, USA. */
#define FUNC(function) function##l
#define MATHTYPE long double
#define FLOAT long double
#define TEST_MSG "testing long double (inline functions)\n"
#define MATHCONST(x) x##L
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Clongdouble
#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cinlinelongdouble
#define PRINTF_EXPR "Le"
#define PRINTF_XEXPR "La"
#define PRINTF_NEXPR "Lf"
#define TEST_INLINE
#ifdef __NO_MATH_INLINES

View File

@ -1,6 +1,6 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@arthur.pfalz.de>, 1997.
Contributed by Andreas Jaeger <aj@suse.de>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@ -18,12 +18,13 @@
Boston, MA 02111-1307, USA. */
#define FUNC(function) function##l
#define MATHTYPE long double
#define FLOAT long double
#define TEST_MSG "testing long double (without inline functions)\n"
#define MATHCONST(x) x##L
#define CHOOSE(Clongdouble,Cdouble,Cfloat) Clongdouble
#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Clongdouble
#define PRINTF_EXPR "Le"
#define PRINTF_XEXPR "La"
#define PRINTF_NEXPR "Lf"
#ifndef __NO_MATH_INLINES
# define __NO_MATH_INLINES

View File

@ -0,0 +1,5 @@
# File with deltas for math/libm-test
# This file is the fallback and contains
# no data
# You can create a new file with e.g. `test-double -u'
# followed by `gen-libm-test.pl -u ULPs -n'.

920
sysdeps/i386/libm-test-ulps Normal file
View File

@ -0,0 +1,920 @@
# Begin of automatic generation
# acos
Test "acos (0.7) == 0.7953988301841435554":
ildouble: 1149
ldouble: 1149
# asin
Test "asin (0.7) == 0.7753974966107530637":
double: 1
ildouble: 1147
ldouble: 1147
# asinh
Test "asinh (-0) == -0":
idouble: 0
ifloat: 0
ildouble: 0
Test "asinh (0.7) == 0.652666566082355786":
ildouble: 656
ldouble: 656
# atan
Test "atan (0.7) == 0.6107259643892086165":
ildouble: 549
ldouble: 549
# atan2
Test "atan2 (0.4, 0.0003) == 1.5700463269355215718":
ildouble: 1
ldouble: 1
Test "atan2 (0.7, 1) == 0.6107259643892086165":
ildouble: 549
ldouble: 549
# atanh
Test "atanh (-0) == -0":
idouble: 0
ifloat: 0
ildouble: 0
Test "atanh (0.7) == 0.8673005276940531944":
double: 1
idouble: 1
ildouble: 1605
ldouble: 1605
# cabs
Test "cabs (-0.7 + 12.4 i) == 12.41974234837422060118":
float: 1
ifloat: 1
Test "cabs (-0.7 - 12.4 i) == 12.41974234837422060118":
float: 1
ifloat: 1
Test "cabs (-12.4 + 0.7 i) == 12.41974234837422060118":
float: 1
ifloat: 1
Test "cabs (-12.4 - 0.7 i) == 12.41974234837422060118":
float: 1
ifloat: 1
Test "cabs (0.7 + 1.2 i) == 1.3892443989449804508":
double: 1
idouble: 1
ildouble: 560
ldouble: 560
Test "cabs (0.7 + 12.4 i) == 12.41974234837422060118":
float: 1
ifloat: 1
# cbrt
Test "cbrt (-0.001) == -0.1":
ildouble: 716
ldouble: 716
Test "cbrt (-27.0) == -3.0":
ildouble: 1
ldouble: 1
Test "cbrt (0.7) == 0.8879040017426007084":
double: 1
idouble: 1
ildouble: 346
ldouble: 346
Test "cbrt (0.970299) == 0.99":
ildouble: 306
ldouble: 306
# cos
Test "cos (0.7) == 0.7648421872844884262":
double: 1
idouble: 1
ildouble: 529
ldouble: 529
Test "cos (M_PI_6l * 2.0) == 0.5":
double: 1
float: 0.5
idouble: 1
ifloat: 0.5
Test "cos (M_PI_6l * 4.0) == -0.5":
double: 2
float: 1
idouble: 2
ifloat: 1
ildouble: 0.5
ldouble: 0.5
Test "cos (pi/2) == 0":
double: 0.2758
float: 0.3667
idouble: 0.2758
ifloat: 0.3667
ildouble: 0.25
ldouble: 0.25
# cosh
Test "cosh (0.7) == 1.255169005630943018":
ildouble: 309
ldouble: 309
# erfc
Test "erfc (0.7) == 0.32219880616258152702":
double: 1
idouble: 1
Test "erfc (1.2) == 0.089686021770364619762":
float: 1
ifloat: 1
Test "erfc (2.0) == 0.0046777349810472658379":
double: 1
idouble: 1
Test "erfc (4.1) == 0.67000276540848983727e-8":
double: 24
float: 12
idouble: 24
ifloat: 12
# exp
Test "exp (0.7) == 2.0137527074704765216":
ildouble: 412
ldouble: 412
# exp10
Test "exp10 (-1) == 0.1":
ildouble: 818
ldouble: 818
Test "exp10 (0.7) == 5.0118723362727228500":
double: 1
idouble: 1
ildouble: 1182
ldouble: 1182
Test "exp10 (3) == 1000":
ildouble: 8
ldouble: 8
# exp2
Test "exp2 (0.7) == 1.6245047927124710452":
ildouble: 462
ldouble: 462
# expm1
Test "expm1 (-0) == -0":
idouble: 0
ifloat: 0
ildouble: 0
Test "expm1 (0.7) == 1.0137527074704765216":
ildouble: 825
ldouble: 825
# fmod
Test "fmod (-6.5, -2.3) == -1.9":
double: 2
float: 1
idouble: 2
ifloat: 1
ildouble: 4096
ldouble: 4096
Test "fmod (-6.5, 2.3) == -1.9":
double: 2
float: 1
idouble: 2
ifloat: 1
ildouble: 4096
ldouble: 4096
Test "fmod (6.5, -2.3) == 1.9":
double: 2
float: 1
idouble: 2
ifloat: 1
ildouble: 4096
ldouble: 4096
Test "fmod (6.5, 2.3) == 1.9":
double: 2
float: 1
idouble: 2
ifloat: 1
ildouble: 4096
ldouble: 4096
# hypot
Test "hypot (-0.7, -12.4) == 12.41974234837422060118":
float: 1
ildouble: 406
ldouble: 406
Test "hypot (-0.7, 12.4) == 12.41974234837422060118":
float: 1
ildouble: 406
ldouble: 406
Test "hypot (-12.4, -0.7) == 12.41974234837422060118":
float: 1
ildouble: 406
ldouble: 406
Test "hypot (-12.4, 0.7) == 12.41974234837422060118":
float: 1
ildouble: 406
ldouble: 406
Test "hypot (0.7, -12.4) == 12.41974234837422060118":
float: 1
ildouble: 406
ldouble: 406
Test "hypot (0.7, 1.2) == 1.3892443989449804508":
double: 1
ildouble: 560
ldouble: 560
Test "hypot (0.7, 12.4) == 12.41974234837422060118":
float: 1
ildouble: 406
ldouble: 406
Test "hypot (12.4, -0.7) == 12.41974234837422060118":
float: 1
ildouble: 406
ldouble: 406
Test "hypot (12.4, 0.7) == 12.41974234837422060118":
float: 1
ildouble: 406
ldouble: 406
# j0
Test "j0 (10.0) == -0.24593576445134833520":
float: 1
ifloat: 1
Test "j0 (2.0) == 0.22389077914123566805":
float: 1
ifloat: 1
Test "j0 (8.0) == 0.17165080713755390609":
float: 1
ifloat: 1
# j1
Test "j1 (10.0) == 0.043472746168861436670":
float: 1
ifloat: 1
Test "j1 (2.0) == 0.57672480775687338720":
double: 1
idouble: 1
Test "j1 (8.0) == 0.23463634685391462438":
float: 1
ifloat: 1
# jn
Test "jn (0, 10.0) == -0.24593576445134833520":
float: 1
ifloat: 1
Test "jn (0, 2.0) == 0.22389077914123566805":
float: 1
ifloat: 1
Test "jn (0, 8.0) == 0.17165080713755390609":
float: 1
ifloat: 1
Test "jn (1, 10.0) == 0.043472746168861436670":
float: 1
ifloat: 1
Test "jn (1, 2.0) == 0.57672480775687338720":
double: 1
idouble: 1
Test "jn (1, 8.0) == 0.23463634685391462438":
float: 1
ifloat: 1
Test "jn (10, 0.1) == 0.26905328954342155795e-19":
double: 4
float: 2
idouble: 4
ifloat: 2
Test "jn (10, 0.7) == 0.75175911502153953928e-11":
double: 3
float: 1
idouble: 3
ifloat: 1
Test "jn (10, 10.0) == 0.20748610663335885770":
float: 1
ifloat: 1
Test "jn (3, 0.1) == 0.000020820315754756261429":
double: 1
idouble: 1
Test "jn (3, 0.7) == 0.0069296548267508408077":
double: 2
idouble: 2
Test "jn (3, 10.0) == 0.058379379305186812343":
float: 1
ifloat: 1
# lgamma
Test "lgamma (0.7) == 0.26086724653166651439":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "lgamma (1.2) == -0.853740900033158497197e-1":
double: 1
float: 2
idouble: 1
ifloat: 2
# log
Test "log (0.7) == -0.35667494393873237891":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 2341
ldouble: 2341
Test "log (e) == 1":
float: 0.5
ifloat: 0.5
# log10
Test "log10 (0.7) == -0.15490195998574316929":
double: 1
idouble: 1
ildouble: 2033
ldouble: 2033
Test "log10 (e) == log10(e)":
float: 1
ifloat: 1
ildouble: 1
ldouble: 1
# log1p
Test "log1p (-0.3) == -0.35667494393873237891":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 585
ldouble: 585
# log2
Test "log2 (0.7) == -0.51457317282975824043":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1688
ldouble: 1688
# pow
Test "pow (-0, 1) == -0":
idouble: 0
ifloat: 0
ildouble: 0
Test "pow (-0, 11) == -0":
idouble: 0
ifloat: 0
ildouble: 0
Test "pow (-0, 27) == -0":
idouble: 0
ifloat: 0
ildouble: 0
Test "pow (0.7, 1.2) == 0.65180494056638638188":
ildouble: 725
ldouble: 725
# sin
Test "sin (0.7) == 0.64421768723769105367":
ildouble: 627
ldouble: 627
# sincos
Test "sincos (0.7, &sin_res, &cos_res) puts 0.64421768723769105367 in sin_res":
ildouble: 627
ldouble: 627
Test "sincos (0.7, &sin_res, &cos_res) puts 0.76484218728448842626 in cos_res":
double: 1
idouble: 1
ildouble: 528
ldouble: 528
Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
double: 1
float: 0.5
idouble: 1
ifloat: 0.5
Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.866025403784438646764 in sin_res":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res":
double: 0.2758
float: 0.3667
idouble: 0.2758
ifloat: 0.3667
ildouble: 0.25
ldouble: 0.25
# sinh
Test "sinh (-0) == -0":
idouble: 0
ifloat: 0
ildouble: 0
Test "sinh (0.7) == 0.75858370183953350346":
float: 1
ifloat: 1
ildouble: 1028
ldouble: 1029
# sqrt
Test "sqrt (0.7) == 0.83666002653407554798":
ildouble: 489
ldouble: 489
Test "sqrt (15239.9025) == 123.45":
ildouble: 325
ldouble: 325
# tan
Test "tan (0.7) == 0.84228838046307944813":
ildouble: 1401
ldouble: 1401
Test "tan (pi/4) == 1":
double: 0.5
idouble: 0.5
# tanh
Test "tanh (-0) == -0":
idouble: 0
ifloat: 0
ildouble: 0
Test "tanh (0.7) == 0.60436777711716349631":
ildouble: 521
ldouble: 521
# tgamma
Test "tgamma (-0.5) == -2 sqrt (pi)":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "tgamma (0.5) == sqrt (pi)":
float: 1
ifloat: 1
Test "tgamma (0.7) == 1.29805533264755778568":
double: 1
float: 1
idouble: 1
ifloat: 1
# y0
Test "y0 (0.1) == -1.5342386513503668441":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "y0 (0.7) == -0.19066492933739506743":
double: 2
idouble: 2
Test "y0 (1.0) == 0.088256964215676957983":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "y0 (1.5) == 0.38244892379775884396":
float: 1
ifloat: 1
Test "y0 (10.0) == 0.055671167283599391424":
float: 1
ifloat: 1
Test "y0 (8.0) == 0.22352148938756622053":
float: 1
ifloat: 1
# y1
Test "y1 (0.1) == -6.4589510947020269877":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "y1 (0.7) == -1.1032498719076333697":
double: 1
idouble: 1
Test "y1 (1.0) == -0.78121282130028871655":
double: 1
idouble: 1
Test "y1 (1.5) == -0.41230862697391129595":
float: 1
ifloat: 1
Test "y1 (10.0) == 0.24901542420695388392":
double: 2
float: 2
idouble: 2
ifloat: 2
Test "y1 (2.0) == -0.10703243154093754689":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "y1 (8.0) == -0.15806046173124749426":
float: 2
ifloat: 2
# yn
Test "yn (0, 0.1) == -1.5342386513503668441":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "yn (0, 0.7) == -0.19066492933739506743":
double: 2
idouble: 2
Test "yn (0, 1.0) == 0.088256964215676957983":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "yn (0, 1.5) == 0.38244892379775884396":
float: 1
ifloat: 1
Test "yn (0, 10.0) == 0.055671167283599391424":
float: 1
ifloat: 1
Test "yn (0, 8.0) == 0.22352148938756622053":
float: 1
ifloat: 1
Test "yn (1, 0.1) == -6.4589510947020269877":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "yn (1, 0.7) == -1.1032498719076333697":
double: 1
idouble: 1
Test "yn (1, 1.0) == -0.78121282130028871655":
double: 1
idouble: 1
Test "yn (1, 1.5) == -0.41230862697391129595":
float: 1
ifloat: 1
Test "yn (1, 10.0) == 0.24901542420695388392":
double: 2
float: 2
idouble: 2
ifloat: 2
Test "yn (1, 2.0) == -0.10703243154093754689":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "yn (1, 8.0) == -0.15806046173124749426":
float: 2
ifloat: 2
Test "yn (10, 0.1) == -0.11831335132045197885e19":
double: 2
float: 1
idouble: 2
ifloat: 1
Test "yn (10, 0.7) == -0.42447194260703866924e10":
double: 6
float: 3
idouble: 6
ifloat: 3
Test "yn (10, 1.0) == -0.12161801427868918929e9":
float: 1
ifloat: 1
Test "yn (10, 10.0) == -0.35981415218340272205":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "yn (10, 2.0) == -129184.54220803928264":
float: 1
ifloat: 1
Test "yn (3, 0.1) == -5099.3323786129048894":
double: 1
float: 1
idouble: 1
ifloat: 1
Test "yn (3, 0.7) == -15.819479052819633505":
double: 2
idouble: 2
Test "yn (3, 10.0) == -0.25136265718383732978":
double: 1
float: 1
idouble: 1
ifloat: 1
# Maximal error of functions:
Function "acos":
ildouble: 1149
ldouble: 1149
Function "asin":
double: 1
ildouble: 1147
ldouble: 1147
Function "asinh":
ildouble: 656
ldouble: 656
Function "atan":
ildouble: 549
ldouble: 549
Function "atan2":
ildouble: 549
ldouble: 549
Function "atanh":
double: 1
idouble: 1
ildouble: 1605
ldouble: 1605
Function "cabs":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 560
ldouble: 560
Function "cacos":
double: 1
float: 2
idouble: 1
ifloat: 2
ildouble: 329
ldouble: 329
Function "cacosh":
double: 1
float: 4
idouble: 1
ifloat: 4
ildouble: 328
ldouble: 328
Function "casin":
double: 3
float: 2
idouble: 3
ifloat: 2
ildouble: 603
ldouble: 603
Function "casinh":
double: 5
float: 6
idouble: 5
ifloat: 6
ildouble: 892
ldouble: 892
Function "catan":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 474
ldouble: 474
Function "catanh":
double: 2
float: 1
idouble: 2
ifloat: 1
ildouble: 447
ldouble: 447
Function "cbrt":
double: 1
idouble: 1
ildouble: 716
ldouble: 716
Function "ccos":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1901
ldouble: 1901
Function "ccosh":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1467
ldouble: 1467
Function "cexp":
float: 1
ifloat: 1
ildouble: 1067
ldouble: 1067
Function "clog":
ildouble: 1
ldouble: 1
Function "clog10":
double: 2
float: 1
idouble: 2
ifloat: 1
ildouble: 1402
ldouble: 1402
Function "cos":
double: 2
float: 1
idouble: 2
ifloat: 1
ildouble: 529
ldouble: 529
Function "cosh":
ildouble: 309
ldouble: 309
Function "cpow":
double: 1.103
float: 4
idouble: 1.103
ifloat: 4
ildouble: 2
ldouble: 2
Function "csin":
ildouble: 966
ldouble: 966
Function "csinh":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 477
ldouble: 477
Function "csqrt":
double: 1
idouble: 1
ildouble: 237
ldouble: 237
Function "ctan":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 690
ldouble: 690
Function "ctanh":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 3074
ldouble: 3074
Function "erfc":
double: 24
float: 12
idouble: 24
ifloat: 12
Function "exp":
ildouble: 412
ldouble: 412
Function "exp10":
double: 1
idouble: 1
ildouble: 1182
ldouble: 1182
Function "exp2":
ildouble: 462
ldouble: 462
Function "expm1":
ildouble: 825
ldouble: 825
Function "fmod":
double: 2
float: 1
idouble: 2
ifloat: 1
ildouble: 4096
ldouble: 4096
Function "hypot":
double: 1
float: 1
ildouble: 560
ldouble: 560
Function "j0":
float: 1
ifloat: 1
Function "j1":
double: 1
float: 1
idouble: 1
ifloat: 1
Function "jn":
double: 4
float: 2
idouble: 4
ifloat: 2
Function "lgamma":
double: 1
float: 2
idouble: 1
ifloat: 2
Function "log":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 2341
ldouble: 2341
Function "log10":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 2033
ldouble: 2033
Function "log1p":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 585
ldouble: 585
Function "log2":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1688
ldouble: 1688
Function "pow":
ildouble: 725
ldouble: 725
Function "sin":
ildouble: 627
ldouble: 627
Function "sincos":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 627
ldouble: 627
Function "sinh":
float: 1
ifloat: 1
ildouble: 1028
ldouble: 1029
Function "sqrt":
ildouble: 489
ldouble: 489
Function "tan":
double: 0.5
idouble: 0.5
ildouble: 1401
ldouble: 1401
Function "tanh":
ildouble: 521
ldouble: 521
Function "tgamma":
double: 1
float: 1
idouble: 1
ifloat: 1
Function "y0":
double: 2
float: 1
idouble: 2
ifloat: 1
Function "y1":
double: 2
float: 2
idouble: 2
ifloat: 2
Function "yn":
double: 6
float: 3
idouble: 6
ifloat: 3
# end of automatic generation