mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
Update.
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:
parent
4dba81eafc
commit
8847214f23
16
ChangeLog
16
ChangeLog
@ -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].
|
||||
|
@ -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
606
math/gen-libm-test.pl
Executable 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;
|
||||
}
|
||||
|
6327
math/libm-test.c
6327
math/libm-test.c
File diff suppressed because it is too large
Load Diff
3950
math/libm-test.inc
Normal file
3950
math/libm-test.inc
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
5
sysdeps/generic/libm-test-ulps
Normal file
5
sysdeps/generic/libm-test-ulps
Normal 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
920
sysdeps/i386/libm-test-ulps
Normal 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
|
Loading…
Reference in New Issue
Block a user