diff --git a/ChangeLog b/ChangeLog index 96f03ffff6..c5c1387bd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +1999-10-18 Andreas Jaeger + + 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 * inet/rcmd.c (iruserok2): Initialize isbad to -1 [PR libc/1405]. diff --git a/math/Makefile b/math/Makefile index 670faaf854..8c326f2650 100644 --- a/math/Makefile +++ b/math/Makefile @@ -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 diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl new file mode 100755 index 0000000000..f7bd323252 --- /dev/null +++ b/math/gen-libm-test.pl @@ -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 , 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 () { + + # 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 () { + 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; +} + diff --git a/math/libm-test.c b/math/libm-test.c deleted file mode 100644 index 4c7fe8b7ae..0000000000 --- a/math/libm-test.c +++ /dev/null @@ -1,6327 +0,0 @@ -/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Andreas Jaeger , 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 - 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. */ - -/* Part of testsuite for libm. - - This file has to be included by a master file that defines: - - Makros: - FUNC(function): converts general function name (like cos) to - name with correct suffix (e.g. cosl or cosf) - MATHCONST(x): like FUNC but for constants (e.g convert 0.0 to 0.0L) - MATHTYPE: floating point type to test - TEST_MSG: informal message to be displayed - CHOOSE(Clongdouble,Cdouble,Cfloat): - chooses one of the parameters as epsilon for testing - equality - PRINTF_EXPR Floating point conversion specification to print a variable - of type MATHTYPE with printf. PRINTF_EXPR just contains - the specifier, not the percent and width arguments, - e.g. "f". - PRINTF_XEXPR Like PRINTF_EXPR, but print in hexadecimal format. - */ - -/* This program isn't finished yet. - It has tests for: - acos, acosh, asin, asinh, atan, atan2, atanh, - cbrt, ceil, copysign, cos, cosh, erf, erfc, exp, exp10, exp2, expm1, - fabs, fdim, floor, fma, fmax, fmin, fmod, fpclassify, - frexp, gamma, hypot, - ilogb, isfinite, isinf, isnan, isnormal, - isless, islessequal, isgreater, isgreaterequal, islessgreater, isunordered, - j0, j1, jn, - ldexp, lgamma, log, log10, log1p, log2, logb, - modf, nearbyint, nextafter, - pow, remainder, remquo, rint, lrint, llrint, - round, lround, llround, - scalb, scalbn, signbit, sin, sincos, sinh, sqrt, tan, tanh, tgamma, trunc, - y0, y1, yn - - and for the following complex math functions: - cabs, cacos, cacosh, carg, casin, casinh, catan, catanh, - ccos, ccosh, cexp, clog, cpow, csin, csinh, csqrt, ctan, ctanh. - - At the moment the following functions aren't tested: - conj, cproj, cimag, creal, drem, - significand, - nan - - The routines using random variables are still under construction. I don't - like it the way it's working now and will change it. - - Parameter handling is primitive in the moment: - --verbose=[0..4] for different levels of output: - 0: only error count - 1: basic report on failed tests (default) - 2: full report on failed tests - 3: full report on failed and passed tests - 4: additional report on exceptions - -v for full output (equals --verbose=4) - -s,--silent outputs only the error count (equals --verbose=0) - */ - -/* "Philosophy": - - This suite tests some aspects of the correct implementation of - mathematical functions in libm. Some simple, specific parameters - are tested for correctness but there's no exhaustive - testing. Handling of specific inputs (e.g. infinity, not-a-number) - is also tested. Correct handling of exceptions is checked - against. These implemented tests should check all cases that are - specified in ISO C 9X. - - Exception testing: At the moment only divide-by-zero and invalid - exceptions are tested. Overflow/underflow and inexact exceptions - aren't checked at the moment. - - NaN values: There exist signalling and quiet NaNs. This implementation - only uses signalling NaN as parameter but does not differenciate - between the two kinds of NaNs as result. - - Inline functions: Inlining functions should give an improvement in - speed - but not in precission. The inlined functions return - reasonable values for a reasonable range of input values. The - result is not necessarily correct for all values and exceptions are - not correctly raised in all cases. Problematic input and return - values are infinity, not-a-number and minus zero. This suite - therefore does not check these specific inputs and the exception - handling for inlined mathematical functions - just the "reasonable" - values are checked. - - Beware: The tests might fail for any of the following reasons: - - Tests are wrong - - Functions are wrong - - Floating Point Unit not working properly - - Compiler has errors - - With e.g. gcc 2.7.2.2 the test for cexp fails because of a compiler error. - */ - -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include - -/* Possible exceptions */ -#define NO_EXCEPTION 0x0 -#define INVALID_EXCEPTION 0x1 -#define DIVIDE_BY_ZERO_EXCEPTION 0x2 - -#define PRINT 1 -#define NO_PRINT 0 - -/* Various constants (we must supply them precalculated for accuracy). */ -#define M_PI_6l .52359877559829887308L -#define M_E2l 7.389056098930650227230L -#define M_E3l 20.08553692318766774093L - -static int noErrors; /* number of errors */ -static int noTests; /* number of tests (without testing exceptions) */ -static int noExcTests; /* number of tests for exception flags */ - -static int verbose = 3; -static MATHTYPE minus_zero, plus_zero; -static MATHTYPE plus_infty, minus_infty, nan_value; - -typedef MATHTYPE (*mathfunc) (MATHTYPE); - -#define BUILD_COMPLEX(real, imag) \ - ({ __complex__ MATHTYPE __retval; \ - __real__ __retval = (real); \ - __imag__ __retval = (imag); \ - __retval; }) - -/* Test if Floating-Point stack hasn't changed */ -static void -fpstack_test (const char *test_name) -{ -#ifdef i386 - static int old_stack; - int sw; - - asm ("fnstsw" : "=a" (sw)); - sw >>= 11; - sw &= 7; - - if (sw != old_stack) - { - printf ("FP-Stack wrong after test %s (%d, should be %d)\n", - test_name, sw, old_stack); - ++noErrors; - old_stack = sw; - } -#endif -} - - -/* Get a random value x with min_value < x < max_value - and min_value, max_value finite, - max_value and min_value shouldn't be too close together */ -static MATHTYPE -random_value (MATHTYPE min_value, MATHTYPE max_value) -{ - int r; - MATHTYPE x; - - r = rand (); - - x = (max_value - min_value) / RAND_MAX * (MATHTYPE) r + min_value; - - if ((x <= min_value) || (x >= max_value) || !isfinite (x)) - x = (max_value - min_value) / 2 + min_value; - - /* Make sure the RNG has no influence on the exceptions. */ - feclearexcept (FE_ALL_EXCEPT); - - return x; -} - - -/* Get a random value x with x > min_value. */ -static MATHTYPE -random_greater (MATHTYPE min_value) -{ - return random_value (min_value, 1e6); /* CHOOSE (LDBL_MAX, DBL_MAX, FLT_MAX) */ -} - - -/* Get a random value x with x < max_value. */ -static MATHTYPE -random_less (MATHTYPE max_value) -{ - return random_value (-1e6, max_value); -} - - -static void -output_new_test (const char *test_name) -{ - if (verbose > 2) - printf ("\nTesting: %s\n", test_name); -} - - -static void -output_pass_value (void) -{ - if (verbose > 2) - printf ("Pass: Value Ok.\n"); -} - - -static void -output_fail_value (const char *test_name) -{ - if (verbose > 0 && verbose < 3) - printf ("Fail: %s\n", test_name); - if (verbose >= 3) - printf ("Fail:\n"); -} - - -/* Test whether a given exception was raised. */ -static void -test_single_exception (const char *test_name, - short int exception, - short int exc_flag, - int fe_flag, - const char *flag_name) -{ -#ifndef TEST_INLINE - if (exception & exc_flag) - { - if (fetestexcept (fe_flag)) - { - if (verbose > 3) - printf ("Pass: Exception \"%s\" set\n", flag_name); - } - else - { - if (verbose && verbose < 3) - printf ("Fail: %s: Exception \"%s\" not set\n", - test_name, flag_name); - if (verbose >= 3) - printf ("Fail: Exception \"%s\" not set\n", - flag_name); - ++noErrors; - } - } - else - { - if (fetestexcept (fe_flag)) - { - if (verbose && verbose < 3) - printf ("Fail: %s: Exception \"%s\" set\n", - test_name, flag_name); - if (verbose >= 3) - printf ("Fail: Exception \"%s\" set\n", - flag_name); - ++noErrors; - } - else - { - if (verbose > 3) - printf ("Pass: Exception \"%s\" not set\n", - flag_name); - } - } -#endif -} - - -/* Test whether exception given by EXCEPTION are raised. */ -static void -test_not_exception (const char *test_name, short int exception) -{ - ++noExcTests; -#ifdef FE_DIVBYZERO - if ((exception & DIVIDE_BY_ZERO_EXCEPTION) == 0) - test_single_exception (test_name, exception, - DIVIDE_BY_ZERO_EXCEPTION, FE_DIVBYZERO, - "Divide by zero"); -#endif -#ifdef FE_INVALID - if ((exception & INVALID_EXCEPTION) == 0) - test_single_exception (test_name, exception, INVALID_EXCEPTION, FE_INVALID, - "Invalid operation"); -#endif - feclearexcept (FE_ALL_EXCEPT); -} - - -/* Test whether exceptions given by EXCEPTION are raised. */ -static void -test_exceptions (const char *test_name, short int exception) -{ - ++noExcTests; -#ifdef FE_DIVBYZERO - test_single_exception (test_name, exception, - DIVIDE_BY_ZERO_EXCEPTION, FE_DIVBYZERO, - "Divide by zero"); -#endif -#ifdef FE_INVALID - test_single_exception (test_name, exception, INVALID_EXCEPTION, FE_INVALID, - "Invalid operation"); -#endif - feclearexcept (FE_ALL_EXCEPT); -} - - -/* Test if two floating point numbers are equal. */ -static int -check_equal (MATHTYPE computed, MATHTYPE supplied, MATHTYPE eps, MATHTYPE * diff) -{ - int ret_value; - - /* Both plus Infinity or both minus infinity. */ - if (isinf (computed) && (isinf (computed) == isinf (supplied))) - return 1; - - if (isnan (computed) && isnan (supplied)) /* isnan works for all types */ - return 1; - - *diff = FUNC(fabs) (computed - supplied); - - - ret_value = (*diff <= eps && - (signbit (computed) == signbit (supplied) || eps != 0.0)); - - /* Make sure the subtraction/comparison - have no influence on the exceptions. */ - feclearexcept (FE_ALL_EXCEPT); - - return ret_value; -} - - -static void -output_result_bool (const char *test_name, int result) -{ - ++noTests; - if (result) - { - output_pass_value (); - } - else - { - output_fail_value (test_name); - if (verbose > 1) - printf (" Value: %d\n", result); - ++noErrors; - } - - fpstack_test (test_name); -} - - -static void -output_isvalue (const char *test_name, int result, - MATHTYPE value) -{ - ++noTests; - if (result) - { - output_pass_value (); - } - else - { - output_fail_value (test_name); - if (verbose > 1) - printf (" Value: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", - value, value); - ++noErrors; - } - - fpstack_test (test_name); -} - - -static void -output_isvalue_ext (const char *test_name, int result, - MATHTYPE value, MATHTYPE parameter) -{ - ++noTests; - if (result) - { - output_pass_value (); - } - else - { - output_fail_value (test_name); - if (verbose > 1) - { - printf (" Value: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", - value, value); - printf (" Parameter: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", - parameter, parameter); - } - noErrors++; - } - - fpstack_test (test_name); -} - - -static void -output_result (const char *test_name, int result, - MATHTYPE computed, MATHTYPE expected, - MATHTYPE difference, - int print_values, int print_diff) -{ - ++noTests; - if (result) - { - output_pass_value (); - } - else - { - output_fail_value (test_name); - if (verbose > 1 && print_values) - { - printf ("Result:\n"); - printf (" is: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", - computed, computed); - printf (" should be: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", - expected, expected); - if (print_diff) - printf (" difference: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR - "\n", difference, difference); - } - ++noErrors; - } - - fpstack_test (test_name); -} - - -static void -output_result_ext (const char *test_name, int result, - MATHTYPE computed, MATHTYPE expected, - MATHTYPE difference, - MATHTYPE parameter, - int print_values, int print_diff) -{ - ++noTests; - if (result) - { - output_pass_value (); - } - else - { - output_fail_value (test_name); - if (verbose > 1 && print_values) - { - printf ("Result:\n"); - printf (" is: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", - computed, computed); - printf (" should be: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", - expected, expected); - if (print_diff) - printf (" difference: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR - "\n", difference, difference); - printf ("Parameter: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", - parameter, parameter); - } - ++noErrors; - } - - fpstack_test (test_name); -} - - -/* check that computed and expected values are the same */ -static void -check (const char *test_name, MATHTYPE computed, MATHTYPE expected) -{ - MATHTYPE diff; - int result; - - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - result = check_equal (computed, expected, 0, &diff); - output_result (test_name, result, - computed, expected, diff, PRINT, PRINT); -} - - -/* check that computed and expected values are the same, - outputs the parameter to the function */ -static void -check_ext (const char *test_name, MATHTYPE computed, MATHTYPE expected, - MATHTYPE parameter) -{ - MATHTYPE diff; - int result; - - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - result = check_equal (computed, expected, 0, &diff); - output_result_ext (test_name, result, - computed, expected, diff, parameter, PRINT, PRINT); -} - - -/* check that computed and expected values are the same and - checks also for exception flags */ -static void -check_exc (const char *test_name, MATHTYPE computed, MATHTYPE expected, - short exception) -{ - MATHTYPE diff; - int result; - - output_new_test (test_name); - test_exceptions (test_name, exception); - result = check_equal (computed, expected, 0, &diff); - output_result (test_name, result, - computed, expected, diff, PRINT, PRINT); -} - - -/* check that computed and expected values are close enough */ -static void -check_eps (const char *test_name, MATHTYPE computed, MATHTYPE expected, - MATHTYPE epsilon) -{ - MATHTYPE diff; - int result; - - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - result = check_equal (computed, expected, epsilon, &diff); - output_result (test_name, result, - computed, expected, diff, PRINT, PRINT); -} - - -/* check a boolean condition */ -static void -check_bool (const char *test_name, int computed) -{ - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - output_result_bool (test_name, computed); -} - - -/* check that computed and expected values are equal (int values) */ -static void -check_int (const char *test_name, int computed, int expected) -{ - int diff = computed - expected; - int result = diff == 0; - - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - - if (result) - { - output_pass_value (); - } - else - { - output_fail_value (test_name); - if (verbose > 1) - { - printf ("Result:\n"); - printf (" is: %d\n", computed); - printf (" should be: %d\n", expected); - } - noErrors++; - } - - fpstack_test (test_name); -} - - -/* check that computed and expected values are equal (long int values) */ -static void -check_long (const char *test_name, long int computed, long int expected) -{ - long int diff = computed - expected; - int result = diff == 0; - - ++noTests; - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - - if (result) - { - output_pass_value (); - } - else - { - output_fail_value (test_name); - if (verbose > 1) - { - printf ("Result:\n"); - printf (" is: %ld\n", computed); - printf (" should be: %ld\n", expected); - } - noErrors++; - } - - fpstack_test (test_name); -} - - -/* check that computed and expected values are equal (long long int values) */ -static void -check_longlong (const char *test_name, long long int computed, - long long int expected) -{ - long long int diff = computed - expected; - int result = diff == 0; - - ++noTests; - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - - if (result) - { - output_pass_value (); - } - else - { - output_fail_value (test_name); - if (verbose > 1) - { - printf ("Result:\n"); - printf (" is: %lld\n", computed); - printf (" should be: %lld\n", expected); - } - noErrors++; - } - - fpstack_test (test_name); -} - - -/* check that computed value is not-a-number */ -static void -check_isnan (const char *test_name, MATHTYPE computed) -{ - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - output_isvalue (test_name, isnan (computed), computed); -} - - -/* check that computed value is not-a-number and test for exceptions */ -static void -check_isnan_exc (const char *test_name, MATHTYPE computed, - short exception) -{ - output_new_test (test_name); - test_exceptions (test_name, exception); - output_isvalue (test_name, isnan (computed), computed); -} - - -/* check that computed value is not-a-number and test for exceptions */ -static void -check_isnan_maybe_exc (const char *test_name, MATHTYPE computed, - short exception) -{ - output_new_test (test_name); - test_not_exception (test_name, exception); - output_isvalue (test_name, isnan (computed), computed); -} - - -/* check that computed value is not-a-number and supply parameter */ -#ifndef TEST_INLINE -static void -check_isnan_ext (const char *test_name, MATHTYPE computed, - MATHTYPE parameter) -{ - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - output_isvalue_ext (test_name, isnan (computed), computed, parameter); -} -#endif - -/* check that computed value is not-a-number, test for exceptions - and supply parameter */ -static void -check_isnan_exc_ext (const char *test_name, MATHTYPE computed, - short exception, MATHTYPE parameter) -{ - output_new_test (test_name); - test_exceptions (test_name, exception); - output_isvalue_ext (test_name, isnan (computed), computed, parameter); -} - - -/* Tests if computed is +Inf */ -static void -check_isinfp (const char *test_name, MATHTYPE computed) -{ - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - output_isvalue (test_name, (isinf (computed) == +1), computed); -} - - -/* Tests if computed is +Inf and supply parameter */ -static void -check_isinfp_ext (const char *test_name, MATHTYPE computed, - MATHTYPE parameter) -{ - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - output_isvalue_ext (test_name, (isinf (computed) == +1), computed, parameter); -} - - -/* Tests if computed is +Inf and check exceptions */ -static void -check_isinfp_exc (const char *test_name, MATHTYPE computed, - int exception) -{ - output_new_test (test_name); - test_exceptions (test_name, exception); - output_isvalue (test_name, (isinf (computed) == +1), computed); -} - - -/* Tests if computed is -Inf */ -static void -check_isinfn (const char *test_name, MATHTYPE computed) -{ - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - output_isvalue (test_name, (isinf (computed) == -1), computed); -} - - -/* Tests if computed is -Inf and supply parameter */ -#ifndef TEST_INLINE -static void -check_isinfn_ext (const char *test_name, MATHTYPE computed, - MATHTYPE parameter) -{ - output_new_test (test_name); - test_exceptions (test_name, NO_EXCEPTION); - output_isvalue_ext (test_name, (isinf (computed) == -1), computed, parameter); -} -#endif - -/* Tests if computed is -Inf and check exceptions */ -static void -check_isinfn_exc (const char *test_name, MATHTYPE computed, - int exception) -{ - output_new_test (test_name); - test_exceptions (test_name, exception); - output_isvalue (test_name, (isinf (computed) == -1), computed); -} - - -/* This is to prevent messages from the SVID libm emulation. */ -int -matherr (struct exception *x __attribute__ ((unused))) -{ - return 1; -} - - -/**************************************************************************** - Test for single functions of libm -****************************************************************************/ - -static void -acos_test (void) -{ -#ifndef TEST_INLINE - MATHTYPE x; - - x = random_greater (1); - check_isnan_exc ("acos (x) == NaN plus invalid exception for |x| > 1", - FUNC(acos) (x), - INVALID_EXCEPTION); - - x = random_less (1); - check_isnan_exc ("acos (x) == NaN plus invalid exception for |x| > 1", - FUNC(acos) (x), - INVALID_EXCEPTION); -#endif - check ("acos (0) == pi/2", FUNC(acos) (0), M_PI_2l); - check ("acos (-0) == pi/2", FUNC(acos) (minus_zero), M_PI_2l); - - check ("acos (1) == 0", FUNC(acos) (1), 0); - check ("acos (-1) == pi", FUNC(acos) (-1), M_PIl); - - check_eps ("acos (0.5) == pi/3", FUNC(acos) (0.5), M_PI_6l * 2.0, - CHOOSE (1e-18, 0, 0)); - check_eps ("acos (-0.5) == 2*pi/3", FUNC(acos) (-0.5), M_PI_6l * 4.0, - CHOOSE (1e-17, 0, 0)); - - check_eps ("acos (0.7) == 0.795398830...", FUNC(acos) (0.7), - 0.7953988301841435554L, CHOOSE (7e-17L, 0, 0)); -} - - -static void -acosh_test (void) -{ -#ifndef TEST_INLINE - MATHTYPE x; - - check_isinfp ("acosh(+inf) == +inf", FUNC(acosh) (plus_infty)); - - x = random_less (1); - check_isnan_exc ("acosh(x) == NaN plus invalid exception if x < 1", - FUNC(acosh) (x), INVALID_EXCEPTION); -#endif - - check ("acosh(1) == 0", FUNC(acosh) (1), 0); - check_eps ("acosh(7) == 2.633915793...", FUNC(acosh) (7), - 2.6339157938496334172L, CHOOSE (3e-19, 0, 0)); -} - - -static void -asin_test (void) -{ -#ifndef TEST_INLINE - MATHTYPE x; - - x = random_greater (1); - check_isnan_exc ("asin x == NaN plus invalid exception for |x| > 1", - FUNC(asin) (x), - INVALID_EXCEPTION); - - x = random_less (1); - check_isnan_exc ("asin x == NaN plus invalid exception for |x| > 1", - FUNC(asin) (x), - INVALID_EXCEPTION); -#endif - - check ("asin (0) == 0", FUNC(asin) (0), 0); - check ("asin (-0) == -0", FUNC(asin) (minus_zero), minus_zero); - check_eps ("asin (0.5) == pi/6", FUNC(asin) (0.5), M_PI_6l, - CHOOSE (3.5e-18, 0, 2e-7)); - check_eps ("asin (-0.5) == -pi/6", FUNC(asin) (-0.5), -M_PI_6l, - CHOOSE (3.5e-18, 0, 2e-7)); - check ("asin (1.0) == pi/2", FUNC(asin) (1.0), M_PI_2l); - check ("asin (-1.0) == -pi/2", FUNC(asin) (-1.0), -M_PI_2l); - check_eps ("asin (0.7) == 0.775397496...", FUNC(asin) (0.7), - 0.7753974966107530637L, CHOOSE (7e-17L, 2e-16, 2e-7)); -} - - -static void -asinh_test (void) -{ - check ("asinh(+0) == +0", FUNC(asinh) (0), 0); -#ifndef TEST_INLINE - check ("asinh(-0) == -0", FUNC(asinh) (minus_zero), minus_zero); - check_isinfp ("asinh(+inf) == +inf", FUNC(asinh) (plus_infty)); - check_isinfn ("asinh(-inf) == -inf", FUNC(asinh) (minus_infty)); -#endif - check_eps ("asinh(0.7) == 0.652666566...", FUNC(asinh) (0.7), - 0.652666566082355786L, CHOOSE (4e-17L, 0, 6e-8)); -} - - -static void -atan_test (void) -{ - check ("atan (0) == 0", FUNC(atan) (0), 0); - check ("atan (-0) == -0", FUNC(atan) (minus_zero), minus_zero); - - check ("atan (+inf) == pi/2", FUNC(atan) (plus_infty), M_PI_2l); - check ("atan (-inf) == -pi/2", FUNC(atan) (minus_infty), -M_PI_2l); - - check_eps ("atan (1) == pi/4", FUNC(atan) (1), M_PI_4l, - CHOOSE (1e-18, 0, 0)); - check_eps ("atan (-1) == -pi/4", FUNC(atan) (1), M_PI_4l, - CHOOSE (1e-18, 0, 0)); - - check_eps ("atan (0.7) == 0.610725964...", FUNC(atan) (0.7), - 0.6107259643892086165L, CHOOSE (3e-17L, 0, 0)); -} - - -static void -atan2_test (void) -{ - MATHTYPE x; - - x = random_greater (0); - check ("atan2 (0,x) == 0 for x > 0", - FUNC(atan2) (0, x), 0); - x = random_greater (0); - check ("atan2 (-0,x) == -0 for x > 0", - FUNC(atan2) (minus_zero, x), minus_zero); - - check ("atan2 (+0,+0) == +0", FUNC(atan2) (0, 0), 0); - check ("atan2 (-0,+0) == -0", FUNC(atan2) (minus_zero, 0), minus_zero); - - x = -random_greater (0); - check ("atan2 (+0,x) == +pi for x < 0", FUNC(atan2) (0, x), M_PIl); - - x = -random_greater (0); - check ("atan2 (-0,x) == -pi for x < 0", FUNC(atan2) (minus_zero, x), -M_PIl); - - check ("atan2 (+0,-0) == +pi", FUNC(atan2) (0, minus_zero), M_PIl); - check ("atan2 (-0,-0) == -pi", FUNC(atan2) (minus_zero, minus_zero), -M_PIl); - - x = random_greater (0); - check ("atan2 (y,+0) == pi/2 for y > 0", FUNC(atan2) (x, 0), M_PI_2l); - - x = random_greater (0); - check ("atan2 (y,-0) == pi/2 for y > 0", FUNC(atan2) (x, minus_zero), - M_PI_2l); - - x = random_less (0); - check ("atan2 (y,+0) == -pi/2 for y < 0", FUNC(atan2) (x, 0), -M_PI_2l); - - x = random_less (0); - check ("atan2 (y,-0) == -pi/2 for y < 0", FUNC(atan2) (x, minus_zero), - -M_PI_2l); - - x = random_greater (0); - check ("atan2 (y,inf) == +0 for finite y > 0", - FUNC(atan2) (x, plus_infty), 0); - - x = -random_greater (0); - check ("atan2 (y,inf) == -0 for finite y < 0", - FUNC(atan2) (x, plus_infty), minus_zero); - - x = random_value (-1e4, 1e4); - check ("atan2(+inf, x) == pi/2 for finite x", - FUNC(atan2) (plus_infty, x), M_PI_2l); - - x = random_value (-1e4, 1e4); - check ("atan2(-inf, x) == -pi/2 for finite x", - FUNC(atan2) (minus_infty, x), -M_PI_2l); - - x = random_greater (0); - check ("atan2 (y,-inf) == +pi for finite y > 0", - FUNC(atan2) (x, minus_infty), M_PIl); - - x = -random_greater (0); - check ("atan2 (y,-inf) == -pi for finite y < 0", - FUNC(atan2) (x, minus_infty), -M_PIl); - - check ("atan2 (+inf,+inf) == +pi/4", - FUNC(atan2) (plus_infty, plus_infty), M_PI_4l); - - check ("atan2 (-inf,+inf) == -pi/4", - FUNC(atan2) (minus_infty, plus_infty), -M_PI_4l); - - check ("atan2 (+inf,-inf) == +3*pi/4", - FUNC(atan2) (plus_infty, minus_infty), 3 * M_PI_4l); - - check ("atan2 (-inf,-inf) == -3*pi/4", - FUNC(atan2) (minus_infty, minus_infty), -3 * M_PI_4l); - - /* FIXME: Add some specific tests */ - check_eps ("atan2 (0.7,1) == 0.61072...", FUNC(atan2) (0.7, 1), - 0.6107259643892086165L, CHOOSE (3e-17L, 0, 0)); - check_eps ("atan2 (0.4,0.0003) == 1.57004...", FUNC(atan2) (0.4, 0.0003), - 1.5700463269355215718L, CHOOSE (2e-19L, 0, 1.2e-7)); -} - - -static void -atanh_test (void) -{ -#ifndef TEST_INLINE - MATHTYPE x; -#endif - - check ("atanh(+0) == +0", FUNC(atanh) (0), 0); -#ifndef TEST_INLINE - check ("atanh(-0) == -0", FUNC(atanh) (minus_zero), minus_zero); - - check_isinfp_exc ("atanh(+1) == +inf plus divide-by-zero exception", - FUNC(atanh) (1), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfn_exc ("atanh(-1) == -inf plus divide-by-zero exception", - FUNC(atanh) (-1), DIVIDE_BY_ZERO_EXCEPTION); - - x = random_greater (1.0); - check_isnan_exc_ext ("atanh (x) == NaN plus invalid exception if |x| > 1", - FUNC(atanh) (x), INVALID_EXCEPTION, x); - - x = random_less (1.0); - check_isnan_exc_ext ("atanh (x) == NaN plus invalid exception if |x| > 1", - FUNC(atanh) (x), INVALID_EXCEPTION, x); - -#endif - check_eps ("atanh(0.7) == 0.867300527...", FUNC(atanh) (0.7), - 0.8673005276940531944L, CHOOSE (9e-17L, 2e-16, 0)); -} - - -static void -cbrt_test (void) -{ - check ("cbrt (+0) == +0", FUNC(cbrt) (0.0), 0.0); - check ("cbrt (-0) == -0", FUNC(cbrt) (minus_zero), minus_zero); - -#ifndef TEST_INLINE - check_isinfp ("cbrt (+inf) == +inf", FUNC(cbrt) (plus_infty)); - check_isinfn ("cbrt (-inf) == -inf", FUNC(cbrt) (minus_infty)); - check_isnan ("cbrt (NaN) == NaN", FUNC(cbrt) (nan_value)); -#endif - check_eps ("cbrt (-0.001) == -0.1", FUNC(cbrt) (-0.001), -0.1, - CHOOSE (5e-18L, 0, 0)); - check_eps ("cbrt (8) == 2", FUNC(cbrt) (8), 2, CHOOSE (5e-17L, 0, 0)); - check_eps ("cbrt (-27) == -3", FUNC(cbrt) (-27.0), -3.0, - CHOOSE (3e-16L, 5e-16, 0)); - check_eps ("cbrt (0.970299) == 0.99", FUNC(cbrt) (0.970299), 0.99, - CHOOSE (2e-17L, 2e-16, 0)); - check_eps ("cbrt (0.7) == .8879040017...", FUNC(cbrt) (0.7), - 0.8879040017426007084L, CHOOSE (2e-17L, 6e-16, 0)); -} - - -static void -ceil_test (void) -{ - check ("ceil (+0) == +0", FUNC(ceil) (0.0), 0.0); - check ("ceil (-0) == -0", FUNC(ceil) (minus_zero), minus_zero); - check_isinfp ("ceil (+inf) == +inf", FUNC(ceil) (plus_infty)); - check_isinfn ("ceil (-inf) == -inf", FUNC(ceil) (minus_infty)); - - check ("ceil (pi) == 4", FUNC(ceil) (M_PIl), 4.0); - check ("ceil (-pi) == -3", FUNC(ceil) (-M_PIl), -3.0); -} - - -static void -cos_test (void) -{ - check ("cos (+0) == 1", FUNC(cos) (0), 1); - check ("cos (-0) == 1", FUNC(cos) (minus_zero), 1); - check_isnan_exc ("cos (+inf) == NaN plus invalid exception", - FUNC(cos) (plus_infty), - INVALID_EXCEPTION); - check_isnan_exc ("cos (-inf) == NaN plus invalid exception", - FUNC(cos) (minus_infty), - INVALID_EXCEPTION); - - check_eps ("cos (pi/3) == 0.5", FUNC(cos) (M_PI_6l * 2.0), - 0.5, CHOOSE (4e-18L, 1e-15L, 1e-7L)); - check_eps ("cos (2*pi/3) == -0.5", FUNC(cos) (M_PI_6l * 4.0), - -0.5, CHOOSE (4e-18L, 1e-15L, 1e-7L)); - check_eps ("cos (pi/2) == 0", FUNC(cos) (M_PI_2l), - 0, CHOOSE (1e-19L, 1e-16L, 1e-7L)); - - check_eps ("cos (0.7) == 0.7648421872...", FUNC(cos) (0.7), - 0.7648421872844884262L, CHOOSE (3e-17, 2e-16, 6e-8)); -} - - -static void -cosh_test (void) -{ - check ("cosh (+0) == 1", FUNC(cosh) (0), 1); - check ("cosh (-0) == 1", FUNC(cosh) (minus_zero), 1); - -#ifndef TEST_INLINE - check_isinfp ("cosh (+inf) == +inf", FUNC(cosh) (plus_infty)); - check_isinfp ("cosh (-inf) == +inf", FUNC(cosh) (minus_infty)); -#endif - - check_eps ("cosh (0.7) == 1.2551690056...", FUNC(cosh) (0.7), - 1.255169005630943018L, CHOOSE (4e-17L, 2.3e-16, 0)); -} - - -static void -erf_test (void) -{ - errno = 0; - FUNC(erf) (0); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - check ("erf (+0) == +0", FUNC(erf) (0), 0); - check ("erf (-0) == -0", FUNC(erf) (minus_zero), minus_zero); - check ("erf (+inf) == +1", FUNC(erf) (plus_infty), 1); - check ("erf (-inf) == -1", FUNC(erf) (minus_infty), -1); - - check_eps ("erf (0.7) == 0.6778011938...", FUNC(erf) (0.7), - 0.67780119383741847297L, CHOOSE (0, 2e-16, 0)); - - check ("erf (1.2) == 0.9103139782...", FUNC(erf) (1.2), - 0.91031397822963538024L); - check ("erf (2.0) == 0.99532...", FUNC(erf) (2.0), - 0.99532226501895273416L); - check ("erf (4.1) == 0.99999...", FUNC(erf) (4.1), - 0.99999999329997234592L); - check ("erf (27) == 1.0", FUNC(erf) (27), - 1.0L); -} - - -static void -erfc_test (void) -{ - errno = 0; - FUNC(erfc) (0); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - check ("erfc (+inf) == 0", FUNC(erfc) (plus_infty), 0.0); - check ("erfc (-inf) == 2", FUNC(erfc) (minus_infty), 2.0); - check ("erfc (+0) == 1", FUNC(erfc) (0.0), 1.0); - check ("erfc (-0) == 1", FUNC(erfc) (minus_zero), 1.0); - - check_eps ("erfc (0.7) == 0.3221988061...", FUNC(erfc) (0.7), - 0.32219880616258152702L, CHOOSE (0, 6e-17, 0)); - - check_eps ("erfc (1.2) == 0.0896860218...", FUNC(erfc) (1.2), - 0.089686021770364619762L, CHOOSE (0, 0, 8e-9)); - check_eps ("erfc (2.0) == 0.0046777349...", FUNC(erfc) (2.0), - 0.0046777349810472658379L, CHOOSE (0, 9e-19, 0)); - check_eps ("erfc (4.1) == 6.70002...*10^-9", FUNC(erfc) (4.1), - 0.67000276540848983727e-8L, CHOOSE (0, 2e-23, 6e-15)); - check ("erfc (9) == 4.13703...*10^-37", FUNC(erfc) (9), - 0.41370317465138102381e-36L); -} - - -static void -exp_test (void) -{ - check ("exp (+0) == 1", FUNC(exp) (0), 1); - check ("exp (-0) == 1", FUNC(exp) (minus_zero), 1); - -#ifndef TEST_INLINE - check_isinfp ("exp (+inf) == +inf", FUNC(exp) (plus_infty)); - check ("exp (-inf) == 0", FUNC(exp) (minus_infty), 0); -#endif - check_eps ("exp (1) == e", FUNC(exp) (1), M_El, CHOOSE (4e-18L, 0, 0)); - - check_eps ("exp (2) == e^2", FUNC(exp) (2), M_E2l, - CHOOSE (1e-18, 8.9e-16, 0)); - check_eps ("exp (3) == e^3", FUNC(exp) (3), M_E3l, - CHOOSE (1.5e-17, 3.6e-15, 0)); - check_eps ("exp (0.7) == 2.0137527074...", FUNC(exp) (0.7), - 2.0137527074704765216L, CHOOSE (9e-17L, 4.5e-16, 0)); -} - - -static void -exp10_test (void) -{ - errno = 0; - FUNC(exp10) (0); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - check ("exp10 (+0) == 1", FUNC(exp10) (0), 1); - check ("exp10 (-0) == 1", FUNC(exp10) (minus_zero), 1); - - check_isinfp ("exp10 (+inf) == +inf", FUNC(exp10) (plus_infty)); - check ("exp10 (-inf) == 0", FUNC(exp10) (minus_infty), 0); - check_eps ("exp10 (3) == 1000", FUNC(exp10) (3), 1000, - CHOOSE (5e-16, 7e-13, 2e-4)); - check_eps ("exp10 (-1) == 0.1", FUNC(exp10) (-1), 0.1, - CHOOSE (6e-18, 3e-17, 8e-09)); - check_isinfp ("exp10 (1e6) == +inf", FUNC(exp10) (1e6)); - check ("exp10 (-1e6) == 0", FUNC(exp10) (-1e6), 0); - check_eps ("exp10 (0.7) == 5.0118723...", FUNC(exp10) (0.7), - 5.0118723362727228500L, CHOOSE (6e-16, 9e-16, 5e-7)); -} - - -static void -exp2_test (void) -{ - errno = 0; - FUNC(exp2) (0); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - check ("exp2 (+0) == 1", FUNC(exp2) (0), 1); - check ("exp2 (-0) == 1", FUNC(exp2) (minus_zero), 1); - - check_isinfp ("exp2 (+inf) == +inf", FUNC(exp2) (plus_infty)); - check ("exp2 (-inf) == 0", FUNC(exp2) (minus_infty), 0); - check ("exp2 (10) == 1024", FUNC(exp2) (10), 1024); - check ("exp2 (-1) == 0.5", FUNC(exp2) (-1), 0.5); - check_isinfp ("exp2 (1e6) == +inf", FUNC(exp2) (1e6)); - check ("exp2 (-1e6) == 0", FUNC(exp2) (-1e6), 0); - check_eps ("exp2 (0.7) == 1.6245047927...", FUNC(exp2) (0.7), - 1.6245047927124710452L, CHOOSE (6e-17L, 0, 1.2e-7)); -} - - -static void -expm1_test (void) -{ - check ("expm1 (+0) == 0", FUNC(expm1) (0), 0); -#ifndef TEST_INLINE - check ("expm1 (-0) == -0", FUNC(expm1) (minus_zero), minus_zero); - - check_isinfp ("expm1 (+inf) == +inf", FUNC(expm1) (plus_infty)); - check ("expm1 (-inf) == -1", FUNC(expm1) (minus_infty), -1); -#endif - - check_eps ("expm1 (1) == e-1", FUNC(expm1) (1), M_El - 1.0, - CHOOSE (4e-18L, 0, 2e-7)); - - check_eps ("expm1 (0.7) == 1.01375...", FUNC(expm1) (0.7), - 1.0137527074704765216L, CHOOSE (9e-17L, 0, 0)); -} - - -static void -check_frexp (const char *test_name, MATHTYPE computed, MATHTYPE expected, - int comp_int, int exp_int) -{ - MATHTYPE diff; - int result; - - result = (check_equal (computed, expected, 0, &diff) - && (comp_int == exp_int)); - - if (result) - { - if (verbose > 2) - printf ("Pass: %s\n", test_name); - } - else - { - if (verbose) - printf ("Fail: %s\n", test_name); - if (verbose > 1) - { - printf ("Result:\n"); - printf (" is: %.20" PRINTF_EXPR " *2^%d %.20" - PRINTF_XEXPR "*2^%d\n", - computed, comp_int, computed, comp_int); - printf (" should be: %.20" PRINTF_EXPR " *2^%d %.20" - PRINTF_XEXPR "*2^%d\n", - expected, exp_int, expected, exp_int); - printf (" difference: %.20" PRINTF_EXPR " %.20" PRINTF_XEXPR "\n", - diff, diff); - } - noErrors++; - } - fpstack_test (test_name); - output_result (test_name, result, - computed, expected, diff, PRINT, PRINT); -} - - -static void -frexp_test (void) -{ - int x_int; - MATHTYPE result; - - result = FUNC(frexp) (plus_infty, &x_int); - check_isinfp ("frexp (+inf, expr) == +inf", result); - - result = FUNC(frexp) (minus_infty, &x_int); - check_isinfn ("frexp (-inf, expr) == -inf", result); - - result = FUNC(frexp) (nan_value, &x_int); - check_isnan ("frexp (Nan, expr) == NaN", result); - - result = FUNC(frexp) (0, &x_int); - check_frexp ("frexp: +0 == 0 * 2^0", result, 0, x_int, 0); - - result = FUNC(frexp) (minus_zero, &x_int); - check_frexp ("frexp: -0 == -0 * 2^0", result, minus_zero, x_int, 0); - - result = FUNC(frexp) (12.8L, &x_int); - check_frexp ("frexp: 12.8 == 0.8 * 2^4", result, 0.8L, x_int, 4); - - result = FUNC(frexp) (-27.34L, &x_int); - check_frexp ("frexp: -27.34 == -0.854375 * 2^5", - result, -0.854375L, x_int, 5); -} - - -static void -fpclassify_test (void) -{ - MATHTYPE x; - - /* fpclassify is a macro, don't give it constants as parameter */ - check_bool ("fpclassify (NaN) == FP_NAN", fpclassify (nan_value) == FP_NAN); - check_bool ("fpclassify (+inf) == FP_INFINITE", - fpclassify (plus_infty) == FP_INFINITE); - check_bool ("fpclassify (-inf) == FP_INFINITE", - fpclassify (minus_infty) == FP_INFINITE); - check_bool ("fpclassify (+0) == FP_ZERO", - fpclassify (plus_zero) == FP_ZERO); - check_bool ("fpclassify (-0) == FP_ZERO", - fpclassify (minus_zero) == FP_ZERO); - - x = 1000.0; - check_bool ("fpclassify (1000) == FP_NORMAL", - fpclassify (x) == FP_NORMAL); -} - - -static void -isfinite_test (void) -{ - check_bool ("isfinite (0) != 0", isfinite (0)); - check_bool ("isfinite (-0) != 0", isfinite (minus_zero)); - check_bool ("isfinite (10) != 0", isfinite (10)); - check_bool ("isfinite (+inf) == 0", isfinite (plus_infty) == 0); - check_bool ("isfinite (-inf) == 0", isfinite (minus_infty) == 0); - check_bool ("isfinite (NaN) == 0", isfinite (nan_value) == 0); -} - - -static void -isnormal_test (void) -{ - check_bool ("isnormal (0) == 0", isnormal (0) == 0); - check_bool ("isnormal (-0) == 0", isnormal (minus_zero) == 0); - check_bool ("isnormal (10) != 0", isnormal (10)); - check_bool ("isnormal (+inf) == 0", isnormal (plus_infty) == 0); - check_bool ("isnormal (-inf) == 0", isnormal (minus_infty) == 0); - check_bool ("isnormal (NaN) == 0", isnormal (nan_value) == 0); -} - - -static void -signbit_test (void) -{ - MATHTYPE x; - - check_bool ("signbit (+0) == 0", signbit (0) == 0); - check_bool ("signbit (-0) != 0", signbit (minus_zero)); - check_bool ("signbit (+inf) == 0", signbit (plus_infty) == 0); - check_bool ("signbit (-inf) != 0", signbit (minus_infty)); - - x = random_less (0); - check_bool ("signbit (x) != 0 for x < 0", signbit (x)); - - x = random_greater (0); - check_bool ("signbit (x) == 0 for x > 0", signbit (x) == 0); -} - - -static void -gamma_test (void) -{ - errno = 0; - FUNC(gamma) (1); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - feclearexcept (FE_ALL_EXCEPT); - - - check_isinfp ("gamma (+inf) == +inf", FUNC(gamma) (plus_infty)); - check_isinfp_exc ("gamma (0) == +inf plus divide by zero exception", - FUNC(gamma) (0), DIVIDE_BY_ZERO_EXCEPTION); - - check_isinfp_exc ("gamma (x) == +inf plus divide by zero exception for integer x <= 0", - FUNC(gamma) (-3), DIVIDE_BY_ZERO_EXCEPTION); - check_isnan_exc ("gamma (-inf) == NaN plus invalid exception", - FUNC(gamma) (minus_infty), INVALID_EXCEPTION); - - signgam = 0; - check ("gamma (1) == 0", FUNC(gamma) (1), 0); - check_int ("gamma (1) sets signgam to 1", signgam, 1); - - signgam = 0; - check ("gamma (3) == M_LN2", FUNC(gamma) (3), M_LN2l); - check_int ("gamma (3) sets signgam to 1", signgam, 1); - - signgam = 0; - check_eps ("gamma (0.5) == log(sqrt(pi))", FUNC(gamma) (0.5), - FUNC(log) (FUNC(sqrt) (M_PIl)), CHOOSE (0, 1e-15, 1e-7)); - check_int ("gamma (0.5) sets signgam to 1", signgam, 1); - - signgam = 0; - check_eps ("gamma (-0.5) == log(2*sqrt(pi))", FUNC(gamma) (-0.5), - FUNC(log) (2*FUNC(sqrt) (M_PIl)), CHOOSE (0, 1e-15, 0)); - - check_int ("gamma (-0.5) sets signgam to -1", signgam, -1); -} - - -static void -tgamma_test (void) -{ - errno = 0; - FUNC(tgamma) (1); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - feclearexcept (FE_ALL_EXCEPT); - - check_isinfp ("tgamma (+inf) == +inf", FUNC(tgamma) (plus_infty)); - check_isnan_exc ("tgamma (0) == NaN plus invalid exception", - FUNC(tgamma) (0), INVALID_EXCEPTION); - - check_isnan_exc_ext ("tgamma (x) == NaN plus invalid exception for integer x <= 0", - FUNC(tgamma) (-2), INVALID_EXCEPTION, -2); - check_isnan_exc ("tgamma (-inf) == NaN plus invalid exception", - FUNC(tgamma) (minus_infty), INVALID_EXCEPTION); - - check_eps ("tgamma (0.5) == sqrt(pi)", FUNC(tgamma) (0.5), - FUNC(sqrt) (M_PIl), CHOOSE (0, 5e-16, 2e-7)); - check_eps ("tgamma (-0.5) == -2*sqrt(pi)", FUNC(tgamma) (-0.5), - -2*FUNC(sqrt) (M_PIl), CHOOSE (0, 5e-16, 3e-7)); - - check ("tgamma (1) == 1", FUNC(tgamma) (1), 1); - check_eps ("tgamma (4) == 6", FUNC(tgamma) (4), 6, CHOOSE (0, 8.9e-16, 0)); - - check_eps ("tgamma (0.7) == 1.29805...", FUNC(tgamma) (0.7), - 1.29805533264755778568L, CHOOSE (0, 3e-16, 2e-7)); - check_eps ("tgamma (1.2) == 0.91816...", FUNC(tgamma) (1.2), - 0.91816874239976061064L, CHOOSE (0, 1.2e-16, 0)); -} - - -static void -lgamma_test (void) -{ - errno = 0; - FUNC(lgamma) (0); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - feclearexcept (FE_ALL_EXCEPT); - - check_isinfp ("lgamma (+inf) == +inf", FUNC(lgamma) (plus_infty)); - check_isinfp_exc ("lgamma (0) == +inf plus divide by zero exception", - FUNC(lgamma) (0), DIVIDE_BY_ZERO_EXCEPTION); - - check_isinfp_exc ("lgamma (x) == +inf plus divide by zero exception for integer x <= 0", - FUNC(lgamma) (-3), DIVIDE_BY_ZERO_EXCEPTION); - check_isnan_exc ("lgamma (-inf) == NaN plus invalid exception", - FUNC(lgamma) (minus_infty), INVALID_EXCEPTION); - - signgam = 0; - check ("lgamma (1) == 0", FUNC(lgamma) (1), 0); - check_int ("lgamma (0) sets signgam to 1", signgam, 1); - - signgam = 0; - check ("lgamma (3) == M_LN2", FUNC(lgamma) (3), M_LN2l); - check_int ("lgamma (3) sets signgam to 1", signgam, 1); - - signgam = 0; - check_eps ("lgamma (0.5) == log(sqrt(pi))", FUNC(lgamma) (0.5), - FUNC(log) (FUNC(sqrt) (M_PIl)), CHOOSE (0, 1e-15, 1e-7)); - check_int ("lgamma (0.5) sets signgam to 1", signgam, 1); - - signgam = 0; - check_eps ("lgamma (-0.5) == log(2*sqrt(pi))", FUNC(lgamma) (-0.5), - FUNC(log) (2*FUNC(sqrt) (M_PIl)), CHOOSE (0, 1e-15, 0)); - - check_int ("lgamma (-0.5) sets signgam to -1", signgam, -1); - - signgam = 0; - check_eps ("lgamma (0.7) == 0.26086...", FUNC(lgamma) (0.7), - 0.26086724653166651439L, CHOOSE (0, 6e-17, 3e-8)); - check_int ("lgamma (0.7) sets signgam to 1", signgam, 1); - - signgam = 0; - check_eps ("lgamma (1.2) == -0.08537...", FUNC(lgamma) (1.2), - -0.853740900033158497197e-1L, CHOOSE (0, 2e-17, 2e-8)); - check_int ("lgamma (1.2) sets signgam to 1", signgam, 1); -} - - -static void -ilogb_test (void) -{ - int i; - - check_int ("ilogb (1) == 0", FUNC(ilogb) (1), 0); - check_int ("ilogb (e) == 1", FUNC(ilogb) (M_El), 1); - check_int ("ilogb (1024) == 10", FUNC(ilogb) (1024), 10); - check_int ("ilogb (-2000) == 10", FUNC(ilogb) (-2000), 10); - - /* XXX We have a problem here: the standard does not tell us whether - exceptions are allowed/required. ignore them for now. */ - i = FUNC(ilogb) (0.0); - feclearexcept (FE_ALL_EXCEPT); - check_int ("ilogb (0) == FP_ILOGB0", i, FP_ILOGB0); - i = FUNC(ilogb) (nan_value); - feclearexcept (FE_ALL_EXCEPT); - check_int ("ilogb (NaN) == FP_ILOGBNAN", i, FP_ILOGBNAN); -} - - -static void -ldexp_test (void) -{ - MATHTYPE x; - - check ("ldexp (0, 0) == 0", FUNC(ldexp) (0, 0), 0); - - check_isinfp ("ldexp (+inf, 1) == +inf", FUNC(ldexp) (plus_infty, 1)); - check_isinfn ("ldexp (-inf, 1) == -inf", FUNC(ldexp) (minus_infty, 1)); - check_isnan ("ldexp (NaN, 1) == NaN", FUNC(ldexp) (nan_value, 1)); - - check ("ldexp (0.8, 4) == 12.8", FUNC(ldexp) (0.8L, 4), 12.8L); - check ("ldexp (-0.854375, 5) == -27.34", FUNC(ldexp) (-0.854375L, 5), -27.34L); - - x = random_greater (0.0); - check_ext ("ldexp (x, 0) == x", FUNC(ldexp) (x, 0L), x, x); -} - - -static void -log_test (void) -{ - check_isinfn_exc ("log (+0) == -inf plus divide-by-zero exception", - FUNC(log) (0), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfn_exc ("log (-0) == -inf plus divide-by-zero exception", - FUNC(log) (minus_zero), DIVIDE_BY_ZERO_EXCEPTION); - - check ("log (1) == 0", FUNC(log) (1), 0); - - check_isnan_exc ("log (x) == NaN plus invalid exception if x < 0", - FUNC(log) (-1), INVALID_EXCEPTION); - check_isinfp ("log (+inf) == +inf", FUNC(log) (plus_infty)); - - check_eps ("log (e) == 1", FUNC(log) (M_El), 1, CHOOSE (1e-18L, 0, 9e-8L)); - check_eps ("log (1/e) == -1", FUNC(log) (1.0 / M_El), -1, - CHOOSE (2e-18L, 0, 0)); - check_eps ("log (2) == M_LN2", FUNC(log) (2), M_LN2l, - CHOOSE (6e-20L, 0, 0)); - check_eps ("log (10) == M_LN10", FUNC(log) (10), M_LN10l, - CHOOSE (1e-18L, 0, 0)); - check_eps ("log (0.7) == -0.3566749439...", FUNC(log) (0.7), - -0.35667494393873237891L, CHOOSE (7e-17L, 6e-17, 3e-8)); -} - - -static void -log10_test (void) -{ - check_isinfn_exc ("log10 (+0) == -inf plus divide-by-zero exception", - FUNC(log10) (0), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfn_exc ("log10 (-0) == -inf plus divide-by-zero exception", - FUNC(log10) (minus_zero), DIVIDE_BY_ZERO_EXCEPTION); - - check ("log10 (1) == +0", FUNC(log10) (1), 0); - - check_isnan_exc ("log10 (x) == NaN plus invalid exception if x < 0", - FUNC(log10) (-1), INVALID_EXCEPTION); - - check_isinfp ("log10 (+inf) == +inf", FUNC(log10) (plus_infty)); - - check_eps ("log10 (0.1) == -1", FUNC(log10) (0.1L), -1, - CHOOSE (1e-18L, 0, 0)); - check_eps ("log10 (10) == 1", FUNC(log10) (10.0), 1, - CHOOSE (1e-18L, 0, 0)); - check_eps ("log10 (100) == 2", FUNC(log10) (100.0), 2, - CHOOSE (1e-18L, 0, 0)); - check ("log10 (10000) == 4", FUNC(log10) (10000.0), 4); - check_eps ("log10 (e) == M_LOG10E", FUNC(log10) (M_El), M_LOG10El, - CHOOSE (1e-18, 0, 9e-8)); - check_eps ("log10 (0.7) == -0.1549019599...", FUNC(log10) (0.7), - -0.15490195998574316929L, CHOOSE (3e-17L, 3e-17, 2e-8)); -} - - -static void -log1p_test (void) -{ - check ("log1p (+0) == +0", FUNC(log1p) (0), 0); - check ("log1p (-0) == -0", FUNC(log1p) (minus_zero), minus_zero); - - check_isinfn_exc ("log1p (-1) == -inf plus divide-by-zero exception", - FUNC(log1p) (-1), DIVIDE_BY_ZERO_EXCEPTION); - check_isnan_exc ("log1p (x) == NaN plus invalid exception if x < -1", - FUNC(log1p) (-2), INVALID_EXCEPTION); - - check_isinfp ("log1p (+inf) == +inf", FUNC(log1p) (plus_infty)); - - check_eps ("log1p (e-1) == 1", FUNC(log1p) (M_El - 1.0), 1, - CHOOSE (1e-18L, 0, 6e-8)); - - check_eps ("log1p (-0.3) == -0.35667...", FUNC(log1p) (-0.3), - -0.35667494393873237891L, CHOOSE (2e-17L, 6e-17, 3e-8)); -} - - -static void -log2_test (void) -{ - check_isinfn_exc ("log2 (+0) == -inf plus divide-by-zero exception", - FUNC(log2) (0), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfn_exc ("log2 (-0) == -inf plus divide-by-zero exception", - FUNC(log2) (minus_zero), DIVIDE_BY_ZERO_EXCEPTION); - - check ("log2 (1) == +0", FUNC(log2) (1), 0); - - check_isnan_exc ("log2 (x) == NaN plus invalid exception if x < 0", - FUNC(log2) (-1), INVALID_EXCEPTION); - - check_isinfp ("log2 (+inf) == +inf", FUNC(log2) (plus_infty)); - - check_eps ("log2 (e) == M_LOG2E", FUNC(log2) (M_El), M_LOG2El, - CHOOSE (1e-18L, 0, 0)); - check ("log2 (2) == 1", FUNC(log2) (2.0), 1); - check_eps ("log2 (16) == 4", FUNC(log2) (16.0), 4, CHOOSE (1e-18L, 0, 0)); - check ("log2 (256) == 8", FUNC(log2) (256.0), 8); - check_eps ("log2 (0.7) == -0.5145731728...", FUNC(log2) (0.7), - -0.51457317282975824043L, CHOOSE (1e-16L, 2e-16, 6e-8)); -} - - -static void -logb_test (void) -{ - check_isinfp ("logb (+inf) == +inf", FUNC(logb) (plus_infty)); - check_isinfp ("logb (-inf) == +inf", FUNC(logb) (minus_infty)); - - check_isinfn_exc ("logb (+0) == -inf plus divide-by-zero exception", - FUNC(logb) (0), DIVIDE_BY_ZERO_EXCEPTION); - - check_isinfn_exc ("logb (-0) == -inf plus divide-by-zero exception", - FUNC(logb) (minus_zero), DIVIDE_BY_ZERO_EXCEPTION); - - check ("logb (1) == 0", FUNC(logb) (1), 0); - check ("logb (e) == 1", FUNC(logb) (M_El), 1); - check ("logb (1024) == 10", FUNC(logb) (1024), 10); - check ("logb (-2000) == 10", FUNC(logb) (-2000), 10); -} - - -static void -modf_test (void) -{ - MATHTYPE result, intpart; - - result = FUNC(modf) (plus_infty, &intpart); - check ("modf (+inf, &x) returns +0", result, 0); - check_isinfp ("modf (+inf, &x) set x to +inf", intpart); - - result = FUNC(modf) (minus_infty, &intpart); - check ("modf (-inf, &x) returns -0", result, minus_zero); - check_isinfn ("modf (-inf, &x) sets x to -inf", intpart); - - result = FUNC(modf) (nan_value, &intpart); - check_isnan ("modf (NaN, &x) returns NaN", result); - check_isnan ("modf (NaN, &x) sets x to NaN", intpart); - - result = FUNC(modf) (0, &intpart); - check ("modf (0, &x) returns 0", result, 0); - check ("modf (0, &x) sets x to 0", intpart, 0); - - result = FUNC(modf) (minus_zero, &intpart); - check ("modf (-0, &x) returns -0", result, minus_zero); - check ("modf (-0, &x) sets x to -0", intpart, minus_zero); - - result = FUNC(modf) (1.5, &intpart); - check ("modf (1.5, &x) returns 0.5", result, 0.5); - check ("modf (1.5, &x) sets x to 1", intpart, 1); - - result = FUNC(modf) (2.5, &intpart); - check ("modf (2.5, &x) returns 0.5", result, 0.5); - check ("modf (2.5, &x) sets x to 2", intpart, 2); - - result = FUNC(modf) (-2.5, &intpart); - check ("modf (-2.5, &x) returns -0.5", result, -0.5); - check ("modf (-2.5, &x) sets x to -2", intpart, -2); - - result = FUNC(modf) (20, &intpart); - check ("modf (20, &x) returns 0", result, 0); - check ("modf (20, &x) sets x to 20", intpart, 20); - - result = FUNC(modf) (21, &intpart); - check ("modf (21, &x) returns 0", result, 0); - check ("modf (21, &x) sets x to 21", intpart, 21); - - result = FUNC(modf) (89.6, &intpart); - check_eps ("modf (89.6, &x) returns 0.6", result, 0.6, - CHOOSE (6e-15L, 6e-15, 2e-6)); - check ("modf (89.6, &x) sets x to 89", intpart, 89); -} - - -static void -scalb_test (void) -{ - MATHTYPE x; - - check_isnan ("scalb (2, 0.5) == NaN", FUNC(scalb) (2, 0.5)); - check_isnan ("scalb (3, -2.5) == NaN", FUNC(scalb) (3, -2.5)); - - check_isnan ("scalb (0, NaN) == NaN", FUNC(scalb) (0, nan_value)); - check_isnan ("scalb (1, NaN) == NaN", FUNC(scalb) (1, nan_value)); - - x = random_greater (0.0); - check ("scalb (x, 0) == 0", FUNC(scalb) (x, 0), x); - x = random_greater (0.0); - check ("scalb (-x, 0) == 0", FUNC(scalb) (-x, 0), -x); - - check_isnan_exc ("scalb (+0, +inf) == NaN plus invalid exception", - FUNC(scalb) (0, plus_infty), INVALID_EXCEPTION); - check_isnan_exc ("scalb (-0, +inf) == NaN plus invalid exception", - FUNC(scalb) (minus_zero, plus_infty), INVALID_EXCEPTION); - - check ("scalb (+0, 2) == +0", FUNC(scalb) (0, 2), 0); - check ("scalb (-0, 4) == -0", FUNC(scalb) (minus_zero, -4), minus_zero); - check ("scalb (+0, 0) == +0", FUNC(scalb) (0, 0), 0); - check ("scalb (-0, 0) == -0", FUNC(scalb) (minus_zero, 0), minus_zero); - check ("scalb (+0, -1) == +0", FUNC(scalb) (0, -1), 0); - check ("scalb (-0, -10) == -0", FUNC(scalb) (minus_zero, -10), minus_zero); - check ("scalb (+0, -inf) == +0", FUNC(scalb) (0, minus_infty), 0); - check ("scalb (-0, -inf) == -0", FUNC(scalb) (minus_zero, minus_infty), - minus_zero); - - check_isinfp ("scalb (+inf, -1) == +inf", FUNC(scalb) (plus_infty, -1)); - check_isinfn ("scalb (-inf, -10) == -inf", FUNC(scalb) (minus_infty, -10)); - check_isinfp ("scalb (+inf, 0) == +inf", FUNC(scalb) (plus_infty, 0)); - check_isinfn ("scalb (-inf, 0) == -inf", FUNC(scalb) (minus_infty, 0)); - check_isinfp ("scalb (+inf, 2) == +inf", FUNC(scalb) (plus_infty, 2)); - check_isinfn ("scalb (-inf, 100) == -inf", FUNC(scalb) (minus_infty, 100)); - - x = random_greater (0.0); - check ("scalb (x, -inf) == 0", FUNC(scalb) (x, minus_infty), 0.0); - check ("scalb (-x, -inf) == -0", FUNC(scalb) (-x, minus_infty), minus_zero); - - x = random_greater (0.0); - check_isinfp ("scalb (x, +inf) == +inf", FUNC(scalb) (x, plus_infty)); - x = random_greater (0.0); - check_isinfn ("scalb (-x, +inf) == -inf", FUNC(scalb) (-x, plus_infty)); - check_isinfp ("scalb (+inf, +inf) == +inf", - FUNC(scalb) (plus_infty, plus_infty)); - check_isinfn ("scalb (-inf, +inf) == -inf", - FUNC(scalb) (minus_infty, plus_infty)); - - check_isnan ("scalb (+inf, -inf) == NaN", - FUNC(scalb) (plus_infty, minus_infty)); - check_isnan ("scalb (-inf, -inf) == NaN", - FUNC(scalb) (minus_infty, minus_infty)); - - check_isnan ("scalb (NaN, 1) == NaN", FUNC(scalb) (nan_value, 1)); - check_isnan ("scalb (1, NaN) == NaN", FUNC(scalb) (1, nan_value)); - check_isnan ("scalb (NaN, 0) == NaN", FUNC(scalb) (nan_value, 0)); - check_isnan ("scalb (0, NaN) == NaN", FUNC(scalb) (0, nan_value)); - check_isnan ("scalb (NaN, +inf) == NaN", - FUNC(scalb) (nan_value, plus_infty)); - check_isnan ("scalb (+inf, NaN) == NaN", - FUNC(scalb) (plus_infty, nan_value)); - check_isnan ("scalb (NaN, NaN) == NaN", FUNC(scalb) (nan_value, nan_value)); - - check ("scalb (0.8, 4) == 12.8", FUNC(scalb) (0.8L, 4), 12.8L); - check ("scalb (-0.854375, 5) == -27.34", FUNC(scalb) (-0.854375L, 5), -27.34L); -} - - -static void -scalbn_test (void) -{ - MATHTYPE x; - - check ("scalbn (0, 0) == 0", FUNC(scalbn) (0, 0), 0); - - check_isinfp ("scalbn (+inf, 1) == +inf", FUNC(scalbn) (plus_infty, 1)); - check_isinfn ("scalbn (-inf, 1) == -inf", FUNC(scalbn) (minus_infty, 1)); - check_isnan ("scalbn (NaN, 1) == NaN", FUNC(scalbn) (nan_value, 1)); - - check ("scalbn (0.8, 4) == 12.8", FUNC(scalbn) (0.8L, 4), 12.8L); - check ("scalbn (-0.854375, 5) == -27.34", FUNC(scalbn) (-0.854375L, 5), -27.34L); - - x = random_greater (0.0); - check_ext ("scalbn (x, 0) == x", FUNC(scalbn) (x, 0L), x, x); -} - - -static void -sin_test (void) -{ - check ("sin (+0) == +0", FUNC(sin) (0), 0); - check ("sin (-0) == -0", FUNC(sin) (minus_zero), minus_zero); - check_isnan_exc ("sin (+inf) == NaN plus invalid exception", - FUNC(sin) (plus_infty), - INVALID_EXCEPTION); - check_isnan_exc ("sin (-inf) == NaN plus invalid exception", - FUNC(sin) (minus_infty), - INVALID_EXCEPTION); - - check_eps ("sin (pi/6) == 0.5", FUNC(sin) (M_PI_6l), - 0.5, CHOOSE (4e-18L, 0, 0)); - check_eps ("sin (-pi/6) == -0.5", FUNC(sin) (-M_PI_6l), - -0.5, CHOOSE (4e-18L, 0, 0)); - check ("sin (pi/2) == 1", FUNC(sin) (M_PI_2l), 1); - check ("sin (-pi/2) == -1", FUNC(sin) (-M_PI_2l), -1); - check_eps ("sin (0.7) == 0.6442176872...", FUNC(sin) (0.7), - 0.64421768723769105367L, CHOOSE (4e-17L, 0, 0)); -} - - -static void -sinh_test (void) -{ - check ("sinh (+0) == +0", FUNC(sinh) (0), 0); - -#ifndef TEST_INLINE - check ("sinh (-0) == -0", FUNC(sinh) (minus_zero), minus_zero); - - check_isinfp ("sinh (+inf) == +inf", FUNC(sinh) (plus_infty)); - check_isinfn ("sinh (-inf) == -inf", FUNC(sinh) (minus_infty)); -#endif - - check_eps ("sinh (0.7) == 0.7585837018...", FUNC(sinh) (0.7), - 0.75858370183953350346L, CHOOSE (6e-17L, 2e-16, 6e-8)); -} - - -static void -sincos_test (void) -{ - MATHTYPE sin_res, cos_res; - fenv_t fenv; - - FUNC(sincos) (0, &sin_res, &cos_res); - fegetenv (&fenv); - check ("sincos (+0, &sin, &cos) puts +0 in sin", sin_res, 0); - fesetenv (&fenv); - check ("sincos (+0, &sin, &cos) puts 1 in cos", cos_res, 1); - - FUNC(sincos) (minus_zero, &sin_res, &cos_res); - fegetenv (&fenv); - check ("sincos (-0, &sin, &cos) puts -0 in sin", sin_res, minus_zero); - fesetenv (&fenv); - check ("sincos (-0, &sin, &cos) puts 1 in cos", cos_res, 1); - - FUNC(sincos) (plus_infty, &sin_res, &cos_res); - fegetenv (&fenv); - check_isnan_exc ("sincos (+inf, &sin, &cos) puts NaN in sin plus invalid exception", - sin_res, INVALID_EXCEPTION); - fesetenv (&fenv); - check_isnan_exc ("sincos (+inf, &sin, &cos) puts NaN in cos plus invalid exception", - cos_res, INVALID_EXCEPTION); - - FUNC(sincos) (minus_infty, &sin_res, &cos_res); - fegetenv (&fenv); - check_isnan_exc ("sincos (-inf,&sin, &cos) puts NaN in sin plus invalid exception", - sin_res, INVALID_EXCEPTION); - fesetenv (&fenv); - check_isnan_exc ("sincos (-inf,&sin, &cos) puts NaN in cos plus invalid exception", - cos_res, INVALID_EXCEPTION); - - FUNC(sincos) (M_PI_2l, &sin_res, &cos_res); - fegetenv (&fenv); - check ("sincos (pi/2, &sin, &cos) puts 1 in sin", sin_res, 1); - fesetenv (&fenv); - check_eps ("sincos (pi/2, &sin, &cos) puts 0 in cos", cos_res, 0, - CHOOSE (1e-18L, 1e-16, 1e-7)); - - FUNC(sincos) (M_PI_6l, &sin_res, &cos_res); - check_eps ("sincos (pi/6, &sin, &cos) puts 0.5 in sin", sin_res, 0.5, - CHOOSE (5e-18L, 0, 0)); - - FUNC(sincos) (M_PI_6l*2.0, &sin_res, &cos_res); - check_eps ("sincos (pi/3, &sin, &cos) puts 0.5 in cos", cos_res, 0.5, - CHOOSE (5e-18L, 1e-15, 1e-7)); - - FUNC(sincos) (0.7, &sin_res, &cos_res); - check_eps ("sincos (0.7, &sin, &cos) puts 0.6442176872... in sin", sin_res, - 0.64421768723769105367L, CHOOSE (4e-17L, 0, 0)); - check_eps ("sincos (0.7, &sin, &cos) puts 0.7648421872... in cos", cos_res, - 0.76484218728448842626L, CHOOSE (3e-17L, 2e-16, 6e-8)); -} - - -static void -tan_test (void) -{ - check ("tan (+0) == +0", FUNC(tan) (0), 0); - check ("tan (-0) == -0", FUNC(tan) (minus_zero), minus_zero); - check_isnan_exc ("tan (+inf) == NaN plus invalid exception", - FUNC(tan) (plus_infty), INVALID_EXCEPTION); - check_isnan_exc ("tan (-inf) == NaN plus invalid exception", - FUNC(tan) (minus_infty), INVALID_EXCEPTION); - - check_eps ("tan (pi/4) == 1", FUNC(tan) (M_PI_4l), 1, - CHOOSE (2e-18L, 1e-15L, 2e-7)); - check_eps ("tan (0.7) == 0.8422883804...", FUNC(tan) (0.7), - 0.84228838046307944813L, CHOOSE (8e-17L, 0, 0)); -} - - -static void -tanh_test (void) -{ - check ("tanh (+0) == +0", FUNC(tanh) (0), 0); -#ifndef TEST_INLINE - check ("tanh (-0) == -0", FUNC(tanh) (minus_zero), minus_zero); - - check ("tanh (+inf) == +1", FUNC(tanh) (plus_infty), 1); - check ("tanh (-inf) == -1", FUNC(tanh) (minus_infty), -1); -#endif - check_eps ("tanh (0.7) == 0.6043677771...", FUNC(tanh) (0.7), - 0.60436777711716349631L, CHOOSE (3e-17L, 2e-16, 6e-8)); -} - - -static void -fabs_test (void) -{ - check ("fabs (+0) == +0", FUNC(fabs) (0), 0); - check ("fabs (-0) == +0", FUNC(fabs) (minus_zero), 0); - - check_isinfp ("fabs (+inf) == +inf", FUNC(fabs) (plus_infty)); - check_isinfp ("fabs (-inf) == +inf", FUNC(fabs) (minus_infty)); - - check ("fabs (+38) == 38", FUNC(fabs) (38.0), 38.0); - check ("fabs (-e) == e", FUNC(fabs) (-M_El), M_El); -} - - -static void -floor_test (void) -{ - check ("floor (+0) == +0", FUNC(floor) (0.0), 0.0); - check ("floor (-0) == -0", FUNC(floor) (minus_zero), minus_zero); - check_isinfp ("floor (+inf) == +inf", FUNC(floor) (plus_infty)); - check_isinfn ("floor (-inf) == -inf", FUNC(floor) (minus_infty)); - - check ("floor (pi) == 3", FUNC(floor) (M_PIl), 3.0); - check ("floor (-pi) == -4", FUNC(floor) (-M_PIl), -4.0); -} - - -static void -hypot_test (void) -{ - MATHTYPE a; - - a = random_greater (0); - check_isinfp_ext ("hypot (+inf, x) == +inf", FUNC(hypot) (plus_infty, a), a); - check_isinfp_ext ("hypot (-inf, x) == +inf", FUNC(hypot) (minus_infty, a), a); - -#ifndef TEST_INLINE - check_isinfp ("hypot (+inf, NaN) == +inf", FUNC(hypot) (plus_infty, nan_value)); - check_isinfp ("hypot (-inf, NaN) == +inf", FUNC(hypot) (minus_infty, nan_value)); -#endif - - check_isnan ("hypot (NaN, NaN) == NaN", FUNC(hypot) (nan_value, nan_value)); - - a = FUNC(hypot) (12.4L, 0.7L); - check ("hypot (x,y) == hypot (y,x)", FUNC(hypot) (0.7L, 12.4L), a); - check ("hypot (x,y) == hypot (-x,y)", FUNC(hypot) (-12.4L, 0.7L), a); - check ("hypot (x,y) == hypot (-y,x)", FUNC(hypot) (-0.7L, 12.4L), a); - check ("hypot (x,y) == hypot (-x,-y)", FUNC(hypot) (-12.4L, -0.7L), a); - check ("hypot (x,y) == hypot (-y,-x)", FUNC(hypot) (-0.7L, -12.4L), a); - check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-0.7L, 0), 0.7L); - check ("hypot (x,0) == fabs (x)", FUNC(hypot) (0.7L, 0), 0.7L); - check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-1.0L, 0), 1.0L); - check ("hypot (x,0) == fabs (x)", FUNC(hypot) (1.0L, 0), 1.0L); - check ("hypot (x,0) == fabs (x)", FUNC(hypot) (-5.7e7L, 0), 5.7e7L); - check ("hypot (x,0) == fabs (x)", FUNC(hypot) (5.7e7L, 0), 5.7e7L); - - check_eps ("hypot (0.7,1.2) == 1.38924...", FUNC(hypot) (0.7, 1.2), - 1.3892443989449804508L, CHOOSE (7e-17L, 3e-16, 0)); -} - - -static void -pow_test (void) -{ - MATHTYPE x; - - check ("pow (+0, +0) == 1", FUNC(pow) (0, 0), 1); - check ("pow (+0, -0) == 1", FUNC(pow) (0, minus_zero), 1); - check ("pow (-0, +0) == 1", FUNC(pow) (minus_zero, 0), 1); - check ("pow (-0, -0) == 1", FUNC(pow) (minus_zero, minus_zero), 1); - - check ("pow (+10, +0) == 1", FUNC(pow) (10, 0), 1); - check ("pow (+10, -0) == 1", FUNC(pow) (10, minus_zero), 1); - check ("pow (-10, +0) == 1", FUNC(pow) (-10, 0), 1); - check ("pow (-10, -0) == 1", FUNC(pow) (-10, minus_zero), 1); - - check ("pow (NaN, +0) == 1", FUNC(pow) (nan_value, 0), 1); - check ("pow (NaN, -0) == 1", FUNC(pow) (nan_value, minus_zero), 1); - -#ifndef TEST_INLINE - check_isinfp ("pow (+1.1, +inf) == +inf", FUNC(pow) (1.1, plus_infty)); - check_isinfp ("pow (+inf, +inf) == +inf", FUNC(pow) (plus_infty, plus_infty)); - check_isinfp ("pow (-1.1, +inf) == +inf", FUNC(pow) (-1.1, plus_infty)); - check_isinfp ("pow (-inf, +inf) == +inf", FUNC(pow) (minus_infty, plus_infty)); - - check ("pow (0.9, +inf) == +0", FUNC(pow) (0.9L, plus_infty), 0); - check ("pow (1e-7, +inf) == +0", FUNC(pow) (1e-7L, plus_infty), 0); - check ("pow (-0.9, +inf) == +0", FUNC(pow) (-0.9L, plus_infty), 0); - check ("pow (-1e-7, +inf) == +0", FUNC(pow) (-1e-7L, plus_infty), 0); - - check ("pow (+1.1, -inf) == 0", FUNC(pow) (1.1, minus_infty), 0); - check ("pow (+inf, -inf) == 0", FUNC(pow) (plus_infty, minus_infty), 0); - check ("pow (-1.1, -inf) == 0", FUNC(pow) (-1.1, minus_infty), 0); - check ("pow (-inf, -inf) == 0", FUNC(pow) (minus_infty, minus_infty), 0); - - check_isinfp ("pow (0.9, -inf) == +inf", FUNC(pow) (0.9L, minus_infty)); - check_isinfp ("pow (1e-7, -inf) == +inf", FUNC(pow) (1e-7L, minus_infty)); - check_isinfp ("pow (-0.9, -inf) == +inf", FUNC(pow) (-0.9L, minus_infty)); - check_isinfp ("pow (-1e-7, -inf) == +inf", FUNC(pow) (-1e-7L, minus_infty)); - - check_isinfp ("pow (+inf, 1e-7) == +inf", FUNC(pow) (plus_infty, 1e-7L)); - check_isinfp ("pow (+inf, 1) == +inf", FUNC(pow) (plus_infty, 1)); - check_isinfp ("pow (+inf, 1e7) == +inf", FUNC(pow) (plus_infty, 1e7L)); - - check ("pow (+inf, -1e-7) == 0", FUNC(pow) (plus_infty, -1e-7L), 0); - check ("pow (+inf, -1) == 0", FUNC(pow) (plus_infty, -1), 0); - check ("pow (+inf, -1e7) == 0", FUNC(pow) (plus_infty, -1e7L), 0); - - check_isinfn ("pow (-inf, 1) == -inf", FUNC(pow) (minus_infty, 1)); - check_isinfn ("pow (-inf, 11) == -inf", FUNC(pow) (minus_infty, 11)); - check_isinfn ("pow (-inf, 1001) == -inf", FUNC(pow) (minus_infty, 1001)); - - check_isinfp ("pow (-inf, 2) == +inf", FUNC(pow) (minus_infty, 2)); - check_isinfp ("pow (-inf, 12) == +inf", FUNC(pow) (minus_infty, 12)); - check_isinfp ("pow (-inf, 1002) == +inf", FUNC(pow) (minus_infty, 1002)); - check_isinfp ("pow (-inf, 0.1) == +inf", FUNC(pow) (minus_infty, 0.1)); - check_isinfp ("pow (-inf, 1.1) == +inf", FUNC(pow) (minus_infty, 1.1)); - check_isinfp ("pow (-inf, 11.1) == +inf", FUNC(pow) (minus_infty, 11.1)); - check_isinfp ("pow (-inf, 1001.1) == +inf", FUNC(pow) (minus_infty, 1001.1)); - - check ("pow (-inf, -1) == -0", FUNC(pow) (minus_infty, -1), minus_zero); - check ("pow (-inf, -11) == -0", FUNC(pow) (minus_infty, -11), minus_zero); - check ("pow (-inf, -1001) == -0", FUNC(pow) (minus_infty, -1001), minus_zero); - - check ("pow (-inf, -2) == +0", FUNC(pow) (minus_infty, -2), 0); - check ("pow (-inf, -12) == +0", FUNC(pow) (minus_infty, -12), 0); - check ("pow (-inf, -1002) == +0", FUNC(pow) (minus_infty, -1002), 0); - check ("pow (-inf, -0.1) == +0", FUNC(pow) (minus_infty, -0.1), 0); - check ("pow (-inf, -1.1) == +0", FUNC(pow) (minus_infty, -1.1), 0); - check ("pow (-inf, -11.1) == +0", FUNC(pow) (minus_infty, -11.1), 0); - check ("pow (-inf, -1001.1) == +0", FUNC(pow) (minus_infty, -1001.1), 0); - - check_isnan ("pow (NaN, NaN) == NaN", FUNC(pow) (nan_value, nan_value)); - check_isnan ("pow (0, NaN) == NaN", FUNC(pow) (0, nan_value)); - check_isnan ("pow (1, NaN) == NaN", FUNC(pow) (1, nan_value)); - check_isnan ("pow (-1, NaN) == NaN", FUNC(pow) (-1, nan_value)); - check_isnan ("pow (NaN, 1) == NaN", FUNC(pow) (nan_value, 1)); - check_isnan ("pow (NaN, -1) == NaN", FUNC(pow) (nan_value, -1)); - - x = random_greater (0.0); - check_isnan_ext ("pow (x, NaN) == NaN", FUNC(pow) (x, nan_value), x); - - check_isnan_exc ("pow (+1, +inf) == NaN plus invalid exception", - FUNC(pow) (1, plus_infty), INVALID_EXCEPTION); - check_isnan_exc ("pow (-1, +inf) == NaN plus invalid exception", - FUNC(pow) (-1, plus_infty), INVALID_EXCEPTION); - check_isnan_exc ("pow (+1, -inf) == NaN plus invalid exception", - FUNC(pow) (1, minus_infty), INVALID_EXCEPTION); - check_isnan_exc ("pow (-1, -inf) == NaN plus invalid exception", - FUNC(pow) (-1, minus_infty), INVALID_EXCEPTION); - - check_isnan_exc ("pow (-0.1, 1.1) == NaN plus invalid exception", - FUNC(pow) (-0.1, 1.1), INVALID_EXCEPTION); - check_isnan_exc ("pow (-0.1, -1.1) == NaN plus invalid exception", - FUNC(pow) (-0.1, -1.1), INVALID_EXCEPTION); - check_isnan_exc ("pow (-10.1, 1.1) == NaN plus invalid exception", - FUNC(pow) (-10.1, 1.1), INVALID_EXCEPTION); - check_isnan_exc ("pow (-10.1, -1.1) == NaN plus invalid exception", - FUNC(pow) (-10.1, -1.1), INVALID_EXCEPTION); - - check_isinfp_exc ("pow (+0, -1) == +inf plus divide-by-zero exception", - FUNC(pow) (0, -1), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfp_exc ("pow (+0, -11) == +inf plus divide-by-zero exception", - FUNC(pow) (0, -11), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfn_exc ("pow (-0, -1) == -inf plus divide-by-zero exception", - FUNC(pow) (minus_zero, -1), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfn_exc ("pow (-0, -11) == -inf plus divide-by-zero exception", - FUNC(pow) (minus_zero, -11), DIVIDE_BY_ZERO_EXCEPTION); - - check_isinfp_exc ("pow (+0, -2) == +inf plus divide-by-zero exception", - FUNC(pow) (0, -2), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfp_exc ("pow (+0, -11.1) == +inf plus divide-by-zero exception", - FUNC(pow) (0, -11.1), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfp_exc ("pow (-0, -2) == +inf plus divide-by-zero exception", - FUNC(pow) (minus_zero, -2), DIVIDE_BY_ZERO_EXCEPTION); - check_isinfp_exc ("pow (-0, -11.1) == +inf plus divide-by-zero exception", - FUNC(pow) (minus_zero, -11.1), DIVIDE_BY_ZERO_EXCEPTION); -#endif - - check ("pow (+0, 1) == +0", FUNC(pow) (0, 1), 0); - check ("pow (+0, 11) == +0", FUNC(pow) (0, 11), 0); -#ifndef TEST_INLINE - check ("pow (-0, 1) == -0", FUNC(pow) (minus_zero, 1), minus_zero); - check ("pow (-0, 11) == -0", FUNC(pow) (minus_zero, 11), minus_zero); -#endif - - check ("pow (+0, 2) == +0", FUNC(pow) (0, 2), 0); - check ("pow (+0, 11.1) == +0", FUNC(pow) (0, 11.1), 0); - -#ifndef TEST_INLINE - check ("pow (-0, 2) == +0", FUNC(pow) (minus_zero, 2), 0); - check ("pow (-0, 11.1) == +0", FUNC(pow) (minus_zero, 11.1), 0); - - x = random_greater (1.0); - check_isinfp_ext ("pow (x, +inf) == +inf for |x| > 1", - FUNC(pow) (x, plus_infty), x); - - x = random_value (-1.0, 1.0); - check_ext ("pow (x, +inf) == +0 for |x| < 1", - FUNC(pow) (x, plus_infty), 0.0, x); - - x = random_greater (1.0); - check_ext ("pow (x, -inf) == +0 for |x| > 1", - FUNC(pow) (x, minus_infty), 0.0, x); - - x = random_value (-1.0, 1.0); - check_isinfp_ext ("pow (x, -inf) == +inf for |x| < 1", - FUNC(pow) (x, minus_infty), x); - - x = random_greater (0.0); - check_isinfp_ext ("pow (+inf, y) == +inf for y > 0", - FUNC(pow) (plus_infty, x), x); - - x = random_less (0.0); - check_ext ("pow (+inf, y) == +0 for y < 0", - FUNC(pow) (plus_infty, x), 0.0, x); - - x = (rand () % 1000000) * 2.0 + 1; /* Get random odd integer > 0 */ - check_isinfn_ext ("pow (-inf, y) == -inf for y an odd integer > 0", - FUNC(pow) (minus_infty, x), x); - - x = ((rand () % 1000000) + 1) * 2.0; /* Get random even integer > 1 */ - check_isinfp_ext ("pow (-inf, y) == +inf for y > 0 and not an odd integer", - FUNC(pow) (minus_infty, x), x); - - x = -((rand () % 1000000) * 2.0 + 1); /* Get random odd integer < 0 */ - check_ext ("pow (-inf, y) == -0 for y an odd integer < 0", - FUNC(pow) (minus_infty, x), minus_zero, x); - - x = ((rand () % 1000000) + 1) * -2.0; /* Get random even integer < 0 */ - check_ext ("pow (-inf, y) == +0 for y < 0 and not an odd integer", - FUNC(pow) (minus_infty, x), 0.0, x); -#endif - - x = (rand () % 1000000) * 2.0 + 1; /* Get random odd integer > 0 */ - check_ext ("pow (+0, y) == +0 for y an odd integer > 0", - FUNC(pow) (0.0, x), 0.0, x); -#ifndef TEST_INLINE - x = (rand () % 1000000) * 2.0 + 1; /* Get random odd integer > 0 */ - check_ext ("pow (-0, y) == -0 for y an odd integer > 0", - FUNC(pow) (minus_zero, x), minus_zero, x); -#endif - - x = ((rand () % 1000000) + 1) * 2.0; /* Get random even integer > 1 */ - check_ext ("pow (+0, y) == +0 for y > 0 and not an odd integer", - FUNC(pow) (0.0, x), 0.0, x); - - x = ((rand () % 1000000) + 1) * 2.0; /* Get random even integer > 1 */ - check_ext ("pow (-0, y) == +0 for y > 0 and not an odd integer", - FUNC(pow) (minus_zero, x), 0.0, x); - - check_eps ("pow (0.7, 1.2) == 0.65180...", FUNC(pow) (0.7, 1.2), - 0.65180494056638638188L, CHOOSE (4e-17L, 0, 0)); - -#ifdef TEST_DOUBLE - check ("pow (-7.49321e+133, -9.80818e+16) == 0", - FUNC(pow) (-7.49321e+133, -9.80818e+16), 0); -#endif -} - - -static void -fdim_test (void) -{ - check ("fdim (+0, +0) = +0", FUNC(fdim) (0, 0), 0); - check ("fdim (9, 0) = 9", FUNC(fdim) (9, 0), 9); - check ("fdim (0, 9) = 0", FUNC(fdim) (0, 9), 0); - check ("fdim (-9, 0) = 0", FUNC(fdim) (-9, 0), 0); - check ("fdim (0, -9) = 9", FUNC(fdim) (0, -9), 9); - - check_isinfp ("fdim (+inf, 9) = +inf", FUNC(fdim) (plus_infty, 9)); - check_isinfp ("fdim (+inf, -9) = +inf", FUNC(fdim) (plus_infty, -9)); - check ("fdim (-inf, 9) = 0", FUNC(fdim) (minus_infty, 9), 0); - check ("fdim (-inf, -9) = 0", FUNC(fdim) (minus_infty, -9), 0); - check_isinfp ("fdim (+9, -inf) = +inf", FUNC(fdim) (9, minus_infty)); - check_isinfp ("fdim (-9, -inf) = +inf", FUNC(fdim) (-9, minus_infty)); - check ("fdim (9, inf) = 0", FUNC(fdim) (9, plus_infty), 0); - check ("fdim (-9, inf) = 0", FUNC(fdim) (-9, plus_infty), 0); - - check_isnan ("fdim (0, NaN) = NaN", FUNC(fdim) (0, nan_value)); - check_isnan ("fdim (9, NaN) = NaN", FUNC(fdim) (9, nan_value)); - check_isnan ("fdim (-9, NaN) = NaN", FUNC(fdim) (-9, nan_value)); - check_isnan ("fdim (NaN, 9) = NaN", FUNC(fdim) (nan_value, 9)); - check_isnan ("fdim (NaN, -9) = NaN", FUNC(fdim) (nan_value, -9)); - check_isnan ("fdim (+inf, NaN) = NaN", FUNC(fdim) (plus_infty, nan_value)); - check_isnan ("fdim (-inf, NaN) = NaN", FUNC(fdim) (minus_infty, nan_value)); - check_isnan ("fdim (NaN, +inf) = NaN", FUNC(fdim) (nan_value, plus_infty)); - check_isnan ("fdim (NaN, -inf) = NaN", FUNC(fdim) (nan_value, minus_infty)); - check_isnan ("fdim (NaN, NaN) = NaN", FUNC(fdim) (nan_value, nan_value)); -} - - -static void -fmin_test (void) -{ - check ("fmin (+0, +0) = +0", FUNC(fmin) (0, 0), 0); - check ("fmin (9, 0) = 0", FUNC(fmin) (9, 0), 0); - check ("fmin (0, 9) = 0", FUNC(fmin) (0, 9), 0); - check ("fmin (-9, 0) = -9", FUNC(fmin) (-9, 0), -9); - check ("fmin (0, -9) = -9", FUNC(fmin) (0, -9), -9); - - check ("fmin (+inf, 9) = 9", FUNC(fmin) (plus_infty, 9), 9); - check ("fmin (9, +inf) = 9", FUNC(fmin) (9, plus_infty), 9); - check ("fmin (+inf, -9) = -9", FUNC(fmin) (plus_infty, -9), -9); - check ("fmin (-9, +inf) = -9", FUNC(fmin) (-9, plus_infty), -9); - check_isinfn ("fmin (-inf, 9) = -inf", FUNC(fmin) (minus_infty, 9)); - check_isinfn ("fmin (-inf, -9) = -inf", FUNC(fmin) (minus_infty, -9)); - check_isinfn ("fmin (+9, -inf) = -inf", FUNC(fmin) (9, minus_infty)); - check_isinfn ("fmin (-9, -inf) = -inf", FUNC(fmin) (-9, minus_infty)); - - check ("fmin (0, NaN) = 0", FUNC(fmin) (0, nan_value), 0); - check ("fmin (9, NaN) = 9", FUNC(fmin) (9, nan_value), 9); - check ("fmin (-9, NaN) = 9", FUNC(fmin) (-9, nan_value), -9); - check ("fmin (NaN, 0) = 0", FUNC(fmin) (nan_value, 0), 0); - check ("fmin (NaN, 9) = NaN", FUNC(fmin) (nan_value, 9), 9); - check ("fmin (NaN, -9) = NaN", FUNC(fmin) (nan_value, -9), -9); - check_isinfp ("fmin (+inf, NaN) = +inf", FUNC(fmin) (plus_infty, nan_value)); - check_isinfn ("fmin (-inf, NaN) = -inf", FUNC(fmin) (minus_infty, nan_value)); - check_isinfp ("fmin (NaN, +inf) = +inf", FUNC(fmin) (nan_value, plus_infty)); - check_isinfn ("fmin (NaN, -inf) = -inf", FUNC(fmin) (nan_value, minus_infty)); - check_isnan ("fmin (NaN, NaN) = NaN", FUNC(fmin) (nan_value, nan_value)); -} - - -static void -fmax_test (void) -{ - check ("fmax (+0, +0) = +0", FUNC(fmax) (0, 0), 0); - check ("fmax (9, 0) = 9", FUNC(fmax) (9, 0), 9); - check ("fmax (0, 9) = 9", FUNC(fmax) (0, 9), 9); - check ("fmax (-9, 0) = 0", FUNC(fmax) (-9, 0), 0); - check ("fmax (0, -9) = 0", FUNC(fmax) (0, -9), 0); - - check_isinfp ("fmax (+inf, 9) = +inf", FUNC(fmax) (plus_infty, 9)); - check_isinfp ("fmax (9, +inf) = +inf", FUNC(fmax) (0, plus_infty)); - check_isinfp ("fmax (-9, +inf) = +inf", FUNC(fmax) (-9, plus_infty)); - check_isinfp ("fmax (+inf, -9) = +inf", FUNC(fmax) (plus_infty, -9)); - check ("fmax (-inf, 9) = 9", FUNC(fmax) (minus_infty, 9), 9); - check ("fmax (-inf, -9) = -9", FUNC(fmax) (minus_infty, -9), -9); - check ("fmax (+9, -inf) = 9", FUNC(fmax) (9, minus_infty), 9); - check ("fmax (-9, -inf) = -9", FUNC(fmax) (-9, minus_infty), -9); - - check ("fmax (0, NaN) = 0", FUNC(fmax) (0, nan_value), 0); - check ("fmax (9, NaN) = 9", FUNC(fmax) (9, nan_value), 9); - check ("fmax (-9, NaN) = 9", FUNC(fmax) (-9, nan_value), -9); - check ("fmax (NaN, 0) = 0", FUNC(fmax) (nan_value, 0), 0); - check ("fmax (NaN, 9) = NaN", FUNC(fmax) (nan_value, 9), 9); - check ("fmax (NaN, -9) = NaN", FUNC(fmax) (nan_value, -9), -9); - check_isinfp ("fmax (+inf, NaN) = +inf", FUNC(fmax) (plus_infty, nan_value)); - check_isinfn ("fmax (-inf, NaN) = -inf", FUNC(fmax) (minus_infty, nan_value)); - check_isinfp ("fmax (NaN, +inf) = +inf", FUNC(fmax) (nan_value, plus_infty)); - check_isinfn ("fmax (NaN, -inf) = -inf", FUNC(fmax) (nan_value, minus_infty)); - check_isnan ("fmax (NaN, NaN) = NaN", FUNC(fmax) (nan_value, nan_value)); -} - - -static void -fmod_test (void) -{ - MATHTYPE x; - - x = random_greater (0); - check_ext ("fmod (+0, y) == +0 for y != 0", FUNC(fmod) (0, x), 0, x); - - x = random_greater (0); - check_ext ("fmod (-0, y) == -0 for y != 0", FUNC(fmod) (minus_zero, x), - minus_zero, x); - - check_isnan_exc_ext ("fmod (+inf, y) == NaN plus invalid exception", - FUNC(fmod) (plus_infty, x), INVALID_EXCEPTION, x); - check_isnan_exc_ext ("fmod (-inf, y) == NaN plus invalid exception", - FUNC(fmod) (minus_infty, x), INVALID_EXCEPTION, x); - check_isnan_exc_ext ("fmod (x, +0) == NaN plus invalid exception", - FUNC(fmod) (x, 0), INVALID_EXCEPTION, x); - check_isnan_exc_ext ("fmod (x, -0) == NaN plus invalid exception", - FUNC(fmod) (x, minus_zero), INVALID_EXCEPTION, x); - - x = random_greater (0); - check_ext ("fmod (x, +inf) == x for x not infinite", - FUNC(fmod) (x, plus_infty), x, x); - x = random_greater (0); - check_ext ("fmod (x, -inf) == x for x not infinite", - FUNC(fmod) (x, minus_infty), x, x); - - check_eps ("fmod (6.5, 2.3) == 1.9", FUNC(fmod) (6.5, 2.3), 1.9, - CHOOSE (5e-16, 1e-15, 2e-7)); - check_eps ("fmod (-6.5, 2.3) == -1.9", FUNC(fmod) (-6.5, 2.3), -1.9, - CHOOSE (5e-16, 1e-15, 2e-7)); - check_eps ("fmod (6.5, -2.3) == 1.9", FUNC(fmod) (6.5, -2.3), 1.9, - CHOOSE (5e-16, 1e-15, 2e-7)); - check_eps ("fmod (-6.5, -2.3) == -1.9", FUNC(fmod) (-6.5, -2.3), -1.9, - CHOOSE (5e-16, 1e-15, 2e-7)); -} - - -static void -nextafter_test (void) -{ - MATHTYPE x; - - check ("nextafter (+0, +0) = +0", FUNC(nextafter) (0, 0), 0); - check ("nextafter (-0, +0) = +0", FUNC(nextafter) (minus_zero, 0), 0); - check ("nextafter (+0, -0) = -0", FUNC(nextafter) (0, minus_zero), - minus_zero); - check ("nextafter (-0, -0) = -0", FUNC(nextafter) (minus_zero, minus_zero), - minus_zero); - - check ("nextafter (9, 9) = 9", FUNC(nextafter) (9, 9), 9); - check ("nextafter (-9, -9) = -9", FUNC(nextafter) (-9, -9), -9); - check_isinfp ("nextafter (+inf, +inf) = +inf", - FUNC(nextafter) (plus_infty, plus_infty)); - check_isinfn ("nextafter (-inf, -inf) = -inf", - FUNC(nextafter) (minus_infty, minus_infty)); - - x = rand () * 1.1; - check_isnan ("nextafter (NaN, x) = NaN", FUNC(nextafter) (nan_value, x)); - check_isnan ("nextafter (x, NaN) = NaN", FUNC(nextafter) (x, nan_value)); - check_isnan ("nextafter (NaN, NaN) = NaN", FUNC(nextafter) (nan_value, - nan_value)); - - /* XXX We need the hexadecimal FP number representation here for further - tests. */ -} - - -static void -copysign_test (void) -{ - check ("copysign (0, 4) = 0", FUNC(copysign) (0, 4), 0); - check ("copysign (0, -4) = -0", FUNC(copysign) (0, -4), minus_zero); - check ("copysign (-0, 4) = 0", FUNC(copysign) (minus_zero, 4), 0); - check ("copysign (-0, -4) = -0", FUNC(copysign) (minus_zero, -4), - minus_zero); - - check_isinfp ("copysign (+inf, 0) = +inf", FUNC(copysign) (plus_infty, 0)); - check_isinfn ("copysign (+inf, -0) = -inf", FUNC(copysign) (plus_infty, - minus_zero)); - check_isinfp ("copysign (-inf, 0) = +inf", FUNC(copysign) (minus_infty, 0)); - check_isinfn ("copysign (-inf, -0) = -inf", FUNC(copysign) (minus_infty, - minus_zero)); - - check ("copysign (0, +inf) = 0", FUNC(copysign) (0, plus_infty), 0); - check ("copysign (0, -inf) = -0", FUNC(copysign) (0, minus_zero), - minus_zero); - check ("copysign (-0, +inf) = 0", FUNC(copysign) (minus_zero, plus_infty), - 0); - check ("copysign (-0, -inf) = -0", FUNC(copysign) (minus_zero, minus_zero), - minus_zero); - - /* XXX More correctly we would have to check the sign of the NaN. */ - check_isnan ("copysign (+NaN, 0) = +NaN", FUNC(copysign) (nan_value, 0)); - check_isnan ("copysign (+NaN, -0) = -NaN", FUNC(copysign) (nan_value, - minus_zero)); - check_isnan ("copysign (-NaN, 0) = +NaN", FUNC(copysign) (-nan_value, 0)); - check_isnan ("copysign (-NaN, -0) = -NaN", FUNC(copysign) (-nan_value, - minus_zero)); -} - - -static void -trunc_test (void) -{ - check ("trunc(0) = 0", FUNC(trunc) (0), 0); - check ("trunc(-0) = -0", FUNC(trunc) (minus_zero), minus_zero); - check ("trunc(0.625) = 0", FUNC(trunc) (0.625), 0); - check ("trunc(-0.625) = -0", FUNC(trunc) (-0.625), minus_zero); - check ("trunc(1) = 1", FUNC(trunc) (1), 1); - check ("trunc(-1) = -1", FUNC(trunc) (-1), -1); - check ("trunc(1.625) = 1", FUNC(trunc) (1.625), 1); - check ("trunc(-1.625) = -1", FUNC(trunc) (-1.625), -1); - - check ("trunc(1048580.625) = 1048580", FUNC(trunc) (1048580.625L), - 1048580L); - check ("trunc(-1048580.625) = -1048580", FUNC(trunc) (-1048580.625L), - -1048580L); - - check ("trunc(8388610.125) = 8388610", FUNC(trunc) (8388610.125L), - 8388610.0L); - check ("trunc(-8388610.125) = -8388610", FUNC(trunc) (-8388610.125L), - -8388610.0L); - - check ("trunc(4294967296.625) = 4294967296", FUNC(trunc) (4294967296.625L), - 4294967296.0L); - check ("trunc(-4294967296.625) = -4294967296", - FUNC(trunc) (-4294967296.625L), -4294967296.0L); - - check_isinfp ("trunc(+inf) = +inf", FUNC(trunc) (plus_infty)); - check_isinfn ("trunc(-inf) = -inf", FUNC(trunc) (minus_infty)); - check_isnan ("trunc(NaN) = NaN", FUNC(trunc) (nan_value)); -} - - -static void -sqrt_test (void) -{ - MATHTYPE x; - - - /* XXX Tests fuer negative x are missing */ - check ("sqrt (0) == 0", FUNC(sqrt) (0), 0); - check_isnan ("sqrt (NaN) == NaN", FUNC(sqrt) (nan_value)); - check_isinfp ("sqrt (+inf) == +inf", FUNC(sqrt) (plus_infty)); - - check ("sqrt (-0) == -0", FUNC(sqrt) (0), 0); - - x = random_less (0.0); - check_isnan_exc_ext ("sqrt (x) == NaN plus invalid exception for x < 0", - FUNC(sqrt) (x), INVALID_EXCEPTION, x); - - x = random_value (0, 10000); - check_ext ("sqrt (x*x) == x", FUNC(sqrt) (x*x), x, x); - check ("sqrt (4) == 2", FUNC(sqrt) (4), 2); - check ("sqrt (2) == 1.14142...", FUNC(sqrt) (2), M_SQRT2l); - check ("sqrt (0.25) == 0.5", FUNC(sqrt) (0.25), 0.5); - check ("sqrt (6642.25) == 81.5", FUNC(sqrt) (6642.25), 81.5); - check_eps ("sqrt (15239.903) == 123.45", FUNC(sqrt) (15239.903), 123.45, - CHOOSE (3e-6L, 3e-6, 8e-6)); - check_eps ("sqrt (0.7) == 0.8366600265", FUNC(sqrt) (0.7), - 0.83666002653407554798L, CHOOSE (3e-17L, 0, 0)); -} - - -static void -remainder_test (void) -{ - MATHTYPE result; - - result = FUNC(remainder) (1, 0); - check_isnan_exc ("remainder(1, +0) == NaN plus invalid exception", - result, INVALID_EXCEPTION); - - result = FUNC(remainder) (1, minus_zero); - check_isnan_exc ("remainder(1, -0) == NaN plus invalid exception", - result, INVALID_EXCEPTION); - - result = FUNC(remainder) (plus_infty, 1); - check_isnan_exc ("remainder(+inf, 1) == NaN plus invalid exception", - result, INVALID_EXCEPTION); - - result = FUNC(remainder) (minus_infty, 1); - check_isnan_exc ("remainder(-inf, 1) == NaN plus invalid exception", - result, INVALID_EXCEPTION); - - result = FUNC(remainder) (1.625, 1.0); - check ("remainder(1.625, 1.0) == -0.375", result, -0.375); - - result = FUNC(remainder) (-1.625, 1.0); - check ("remainder(-1.625, 1.0) == 0.375", result, 0.375); - - result = FUNC(remainder) (1.625, -1.0); - check ("remainder(1.625, -1.0) == -0.375", result, -0.375); - - result = FUNC(remainder) (-1.625, -1.0); - check ("remainder(-1.625, -1.0) == 0.375", result, 0.375); - - result = FUNC(remainder) (5.0, 2.0); - check ("remainder(5.0, 2.0) == 1.0", result, 1.0); - - result = FUNC(remainder) (3.0, 2.0); - check ("remainder(3.0, 2.0) == -1.0", result, -1.0); -} - - -static void -remquo_test (void) -{ - int quo; - MATHTYPE result; - - result = FUNC(remquo) (1, 0, &quo); - check_isnan_exc ("remquo(1, +0, &x) == NaN plus invalid exception", - result, INVALID_EXCEPTION); - - result = FUNC(remquo) (1, minus_zero, &quo); - check_isnan_exc ("remquo(1, -0, &x) == NaN plus invalid exception", - result, INVALID_EXCEPTION); - - result = FUNC(remquo) (plus_infty, 1, &quo); - check_isnan_exc ("remquo(+inf, 1, &x) == NaN plus invalid exception", - result, INVALID_EXCEPTION); - - result = FUNC(remquo) (minus_infty, 1, &quo); - check_isnan_exc ("remquo(-inf, 1, &x) == NaN plus invalid exception", - result, INVALID_EXCEPTION); - - result = FUNC(remquo) (1.625, 1.0, &quo); - check ("remquo(1.625, 1.0, &x) == -0.375", result, -0.375); - check_long ("remquo(1.625, 1.0, &x) puts 2 in x", quo, 2); - - result = FUNC(remquo) (-1.625, 1.0, &quo); - check ("remquo(-1.625, 1.0, &x) == 0.375", result, 0.375); - check_long ("remquo(-1.625, 1.0, &x) puts -2 in x", quo, -2); - - result = FUNC(remquo) (1.625, -1.0, &quo); - check ("remquo(1.625, -1.0, &x) == -0.375", result, -0.375); - check_long ("remquo(1.625, -1.0, &x) puts -2 in x", quo, -2); - - result = FUNC(remquo) (-1.625, -1.0, &quo); - check ("remquo(-1.625, -1.0, &x) == 0.375", result, 0.375); - check_long ("remquo(-1.625, -1.0, &x) puts 2 in x", quo, 2); - - result = FUNC(remquo) (5.0, 2.0, &quo); - check ("remquo(5.0, 2.0, &x) == 1.0", result, 1.0); - check_long ("remquo (5.0, 2.0, &x) puts 2 in x", quo, 2); - - result = FUNC(remquo) (3.0, 2.0, &quo); - check ("remquo(3.0, 2.0, &x) == -1.0", result, -1.0); - check_long ("remquo (3.0, 2.0, &x) puts 2 in x", quo, 2); -} - - -static void -cexp_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(cexp) (BUILD_COMPLEX (plus_zero, plus_zero)); - check ("real(cexp(0 + 0i)) = 1", __real__ result, 1); - check ("imag(cexp(0 + 0i)) = 0", __imag__ result, 0); - result = FUNC(cexp) (BUILD_COMPLEX (minus_zero, plus_zero)); - check ("real(cexp(-0 + 0i)) = 1", __real__ result, 1); - check ("imag(cexp(-0 + 0i)) = 0", __imag__ result, 0); - result = FUNC(cexp) (BUILD_COMPLEX (plus_zero, minus_zero)); - check ("real(cexp(0 - 0i)) = 1", __real__ result, 1); - check ("imag(cexp(0 - 0i)) = -0", __imag__ result, minus_zero); - result = FUNC(cexp) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(cexp(-0 - 0i)) = 1", __real__ result, 1); - check ("imag(cexp(-0 - 0i)) = -0", __imag__ result, minus_zero); - - result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, plus_zero)); - check_isinfp ("real(cexp(+inf + 0i)) = +inf", __real__ result); - check ("imag(cexp(+inf + 0i)) = 0", __imag__ result, 0); - result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isinfp ("real(cexp(+inf - 0i)) = +inf", __real__ result); - check ("imag(cexp(+inf - 0i)) = -0", __imag__ result, minus_zero); - - result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, plus_zero)); - check ("real(cexp(-inf + 0i)) = 0", __real__ result, 0); - check ("imag(cexp(-inf + 0i)) = 0", __imag__ result, 0); - result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, minus_zero)); - check ("real(cexp(-inf - 0i)) = 0", __real__ result, 0); - check ("imag(cexp(-inf - 0i)) = -0", __imag__ result, minus_zero); - - - result = FUNC(cexp) (BUILD_COMPLEX (0.0, plus_infty)); - check_isnan_exc ("real(cexp(0 + i inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(0 + i inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(cexp) (BUILD_COMPLEX (minus_zero, plus_infty)); - check_isnan_exc ("real(cexp(-0 + i inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(-0 + i inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (0.0, minus_infty)); - check_isnan_exc ("real(cexp(0 - i inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(0 - i inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (minus_zero, minus_infty)); - check_isnan_exc ("real(cexp(-0 - i inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(-0 - i inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(cexp) (BUILD_COMPLEX (100.0, plus_infty)); - check_isnan_exc ("real(cexp(100.0 + i inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(100.0 + i inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (-100.0, plus_infty)); - check_isnan_exc ("real(cexp(-100.0 + i inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(-100.0 + i inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (100.0, minus_infty)); - check_isnan_exc ("real(cexp(100.0 - i inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(100.0 - i inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (-100.0, minus_infty)); - check_isnan_exc ("real(cexp(-100.0 - i inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(-100.0 - i inf)) = NaN", __imag__ result); - - result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, 2.0)); - check ("real(cexp(-inf + 2.0i)) = -0", __real__ result, minus_zero); - check ("imag(cexp(-inf + 2.0i)) = 0", __imag__ result, 0); - result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, 4.0)); - check ("real(cexp(-inf + 4.0i)) = -0", __real__ result, minus_zero); - check ("imag(cexp(-inf + 4.0i)) = -0", __imag__ result, minus_zero); - - result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, 2.0)); - check_isinfn ("real(cexp(+inf + 2.0i)) = -inf", __real__ result); - check_isinfp ("imag(cexp(+inf + 2.0i)) = +inf", __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, 4.0)); - check_isinfn ("real(cexp(+inf + 4.0i)) = -inf", __real__ result); - check_isinfn ("imag(cexp(+inf + 4.0i)) = -inf", __imag__ result); - - result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isinfp_exc ("real(cexp(+inf + i inf)) = +inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(+inf + i inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isinfp_exc ("real(cexp(+inf - i inf)) = +inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(+inf - i inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, plus_infty)); - check ("real(cexp(-inf + i inf)) = 0", __real__ result, 0); - check ("imag(cexp(-inf + i inf)) = 0", __imag__ result, 0); - result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, minus_infty)); - check ("real(cexp(-inf - i inf)) = 0", __real__ result, 0); - check ("imag(cexp(-inf - i inf)) = -0", __imag__ result, minus_zero); - - result = FUNC(cexp) (BUILD_COMPLEX (minus_infty, nan_value)); - check ("real(cexp(-inf + i NaN)) = 0", __real__ result, 0); - check ("imag(cexp(-inf + i NaN)) = 0", fabs (__imag__ result), 0); - - result = FUNC(cexp) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isinfp ("real(cexp(+inf + i NaN)) = +inf", __real__ result); - check_isnan ("imag(cexp(+inf + i NaN)) = NaN", __imag__ result); - - result = FUNC(cexp) (BUILD_COMPLEX (nan_value, 0.0)); - check_isnan_maybe_exc ("real(cexp(NaN + i0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(NaN + i0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (nan_value, 1.0)); - check_isnan_maybe_exc ("real(cexp(NaN + 1i)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(NaN + 1i)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isnan_maybe_exc ("real(cexp(NaN + i inf)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(NaN + i inf)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(cexp) (BUILD_COMPLEX (0, nan_value)); - check_isnan_maybe_exc ("real(cexp(0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(cexp) (BUILD_COMPLEX (1, nan_value)); - check_isnan_maybe_exc ("real(cexp(1 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cexp(1 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(cexp) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(cexp(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(cexp(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(cexp) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(cexp(0.7 + i 1.2)) == 0.72969...", __real__ result, - 0.7296989091503236012L, CHOOSE (6e-17L, 2e-16, 2e-7)); - check_eps ("imag(cexp(0.7 + i 1.2)) == 1.87689...", __imag__ result, - 1.8768962328348102821L, CHOOSE (2e-16L, 4.5e-16, 3e-7)); - - result = FUNC(cexp) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(cexp(-2 - i 3)) == -0.13398...", __real__ result, - -0.1339809149295426134L, CHOOSE (6.8e-20L, 2.8e-17, 2e-8)); - check_eps ("imag(cexp(-2 - i 3)) == -0.01909...", __imag__ result, - -0.0190985162611351964L, CHOOSE (4e-20L, 3.5e-18, 2e-9)); -} - - -static void -csin_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(csin) (BUILD_COMPLEX (0.0, 0.0)); - check ("real(csin(0 + 0i)) = 0", __real__ result, 0); - check ("imag(csin(0 + 0i)) = 0", __imag__ result, 0); - result = FUNC(csin) (BUILD_COMPLEX (minus_zero, 0.0)); - check ("real(csin(-0 + 0i)) = -0", __real__ result, minus_zero); - check ("imag(csin(-0 + 0i)) = 0", __imag__ result, 0); - result = FUNC(csin) (BUILD_COMPLEX (0.0, minus_zero)); - check ("real(csin(0 - 0i)) = 0", __real__ result, 0); - check ("imag(csin(0 - 0i)) = -0", __imag__ result, minus_zero); - result = FUNC(csin) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(csin(-0 - 0i)) = -0", __real__ result, minus_zero); - check ("imag(csin(-0 - 0i)) = -0", __imag__ result, minus_zero); - - result = FUNC(csin) (BUILD_COMPLEX (0.0, plus_infty)); - check ("real(csin(0 + i Inf)) = 0", __real__ result, 0); - check_isinfp ("imag(csin(0 + i Inf)) = +Inf", __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (minus_zero, plus_infty)); - check ("real(csin(-0 + i Inf)) = -0", __real__ result, minus_zero); - check_isinfp ("imag(csin(-0 + i Inf)) = +Inf", __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (0.0, minus_infty)); - check ("real(csin(0 - i Inf)) = 0", __real__ result, 0); - check_isinfn ("imag(csin(0 - i Inf)) = -Inf", __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (minus_zero, minus_infty)); - check ("real(csin(-0 - i Inf)) = -0", __real__ result, minus_zero); - check_isinfn ("imag(csin(-0 - i Inf)) = -Inf", __imag__ result); - - result = FUNC(csin) (BUILD_COMPLEX (plus_infty, 0.0)); - check_isnan_exc ("real(csin(+Inf + 0i)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(csin(+Inf + 0i)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - result = FUNC(csin) (BUILD_COMPLEX (minus_infty, 0.0)); - check_isnan_exc ("real(csin(-Inf + 0i)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(csin(-Inf + 0i)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - result = FUNC(csin) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isnan_exc ("real(csin(+Inf - 0i)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(csin(+Inf - 0i)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0.0); - result = FUNC(csin) (BUILD_COMPLEX (minus_infty, minus_zero)); - check_isnan_exc ("real(csin(-Inf - 0i)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(csin(-Inf - 0i)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0.0); - - result = FUNC(csin) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isnan_exc ("real(csin(+Inf + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isinfp ("imag(csin(+Inf + i Inf)) = +-Inf plus invalid exception", - FUNC(fabs) (__imag__ result)); - result = FUNC(csin) (BUILD_COMPLEX (minus_infty, plus_infty)); - check_isnan_exc ("real(csin(-Inf + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isinfp ("imag(csin(-Inf + i Inf)) = +-Inf plus invalid exception", - FUNC(fabs) (__imag__ result)); - result = FUNC(csin) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isnan_exc ("real(csin(Inf - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isinfp ("imag(csin(Inf - i Inf)) = +-Inf plus invalid exception", - FUNC(fabs) (__imag__ result)); - result = FUNC(csin) (BUILD_COMPLEX (minus_infty, minus_infty)); - check_isnan_exc ("real(csin(-Inf - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isinfp ("imag(csin(-Inf - i Inf)) = +-Inf plus invalid exception", - FUNC(fabs) (__imag__ result)); - - result = FUNC(csin) (BUILD_COMPLEX (plus_infty, 6.75)); - check_isnan_exc ("real(csin(+Inf + i 6.75)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(+Inf + i6.75)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (plus_infty, -6.75)); - check_isnan_exc ("real(csin(+Inf - i 6.75)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(+Inf - i6.75)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (minus_infty, 6.75)); - check_isnan_exc ("real(csin(-Inf + i6.75)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(-Inf + i6.75)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (minus_infty, -6.75)); - check_isnan_exc ("real(csin(-Inf - i6.75)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(-Inf - i6.75)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(csin) (BUILD_COMPLEX (4.625, plus_infty)); - check_isinfn ("real(csin(4.625 + i Inf)) = -Inf", __real__ result); - check_isinfn ("imag(csin(4.625 + i Inf)) = -Inf", __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (4.625, minus_infty)); - check_isinfn ("real(csin(4.625 - i Inf)) = -Inf", __real__ result); - check_isinfp ("imag(csin(4.625 - i Inf)) = +Inf", __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (-4.625, plus_infty)); - check_isinfp ("real(csin(-4.625 + i Inf)) = +Inf", __real__ result); - check_isinfn ("imag(csin(-4.625 + i Inf)) = -Inf", __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (-4.625, minus_infty)); - check_isinfp ("real(csin(-4.625 - i Inf)) = +Inf", __real__ result); - check_isinfp ("imag(csin(-4.625 - i Inf)) = +Inf", __imag__ result); - - result = FUNC(csin) (BUILD_COMPLEX (nan_value, 0.0)); - check_isnan ("real(csin(NaN + i0)) = NaN", __real__ result); - check ("imag(csin(NaN + i0)) = +-0", FUNC(fabs) (__imag__ result), 0); - result = FUNC(csin) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan ("real(csin(NaN - i0)) = NaN", __real__ result); - check ("imag(csin(NaN - i0)) = +-0", FUNC(fabs) (__imag__ result), 0); - - result = FUNC(csin) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isnan ("real(csin(NaN + i Inf)) = NaN", __real__ result); - check_isinfp ("imag(csin(NaN + i Inf)) = +-Inf", - FUNC(fabs) (__imag__ result)); - result = FUNC(csin) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isnan ("real(csin(NaN - i Inf)) = NaN", __real__ result); - check_isinfp ("real(csin(NaN - i Inf)) = +-Inf", - FUNC(fabs) (__imag__ result)); - - result = FUNC(csin) (BUILD_COMPLEX (nan_value, 9.0)); - check_isnan_maybe_exc ("real(csin(NaN + i9.0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(NaN + i9.0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (nan_value, -9.0)); - check_isnan_maybe_exc ("real(csin(NaN - i9.0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(NaN - i9.0)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(csin) (BUILD_COMPLEX (0.0, nan_value)); - check ("real(csin(0 + i NaN))", __real__ result, 0.0); - check_isnan ("imag(csin(0 + i NaN)) = NaN", __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (minus_zero, nan_value)); - check ("real(csin(-0 + i NaN)) = -0", __real__ result, minus_zero); - check_isnan ("imag(csin(-0 + NaN)) = NaN", __imag__ result); - - result = FUNC(csin) (BUILD_COMPLEX (10.0, nan_value)); - check_isnan_maybe_exc ("real(csin(10 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(10 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (nan_value, -10.0)); - check_isnan_maybe_exc ("real(csin(-10 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(-10 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(csin) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isnan_maybe_exc ("real(csin(+Inf + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(+Inf + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csin) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isnan_maybe_exc ("real(csin(-Inf + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csin(-Inf + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(csin) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(csin(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(csin(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(csin) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(csin(0.7 + i 1.2)) = 1.166456341...", __real__ result, - 1.1664563419657581376L, CHOOSE (2e-16L, 2.3e-16, 0)); - check_eps ("imag(csin(0.7 + i 1.2)) = 1.154499724...", __imag__ result, - 1.1544997246948547371L, CHOOSE (2e-17L, 0, 2e-7)); - - result = FUNC(csin) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(csin(-2 - i 3)) == -9.15449...", __real__ result, - -9.1544991469114295734L, CHOOSE (4e-18L, 1.8e-15, 1e-6)); - check_eps ("imag(csin(-2 - i 3)) == -4.16890...", __imag__ result, - 4.1689069599665643507L, CHOOSE (2e-17L, 0, 5e-7)); -} - - -static void -csinh_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(csinh) (BUILD_COMPLEX (0.0, 0.0)); - check ("real(csinh(0 + 0i)) = 0", __real__ result, 0); - check ("imag(csinh(0 + 0i)) = 0", __imag__ result, 0); - result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, 0.0)); - check ("real(csinh(-0 + 0i)) = -0", __real__ result, minus_zero); - check ("imag(csinh(-0 + 0i)) = 0", __imag__ result, 0); - result = FUNC(csinh) (BUILD_COMPLEX (0.0, minus_zero)); - check ("real(csinh(0 - 0i)) = 0", __real__ result, 0); - check ("imag(csinh(0 - 0i)) = -0", __imag__ result, minus_zero); - result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(csinh(-0 - 0i)) = -0", __real__ result, minus_zero); - check ("imag(csinh(-0 - 0i)) = -0", __imag__ result, minus_zero); - - result = FUNC(csinh) (BUILD_COMPLEX (0.0, plus_infty)); - check_exc ("real(csinh(0 + i Inf)) = +-0 plus invalid exception", - FUNC(fabs) (__real__ result), 0, INVALID_EXCEPTION); - check_isnan ("imag(csinh(0 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, plus_infty)); - check_exc ("real(csinh(-0 + i Inf)) = +-0 plus invalid exception", - FUNC(fabs) (__real__ result), 0, INVALID_EXCEPTION); - check_isnan ("imag(csinh(-0 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (0.0, minus_infty)); - check_exc ("real(csinh(0 - i Inf)) = +-0 plus invalid exception", - FUNC(fabs) (__real__ result), 0, INVALID_EXCEPTION); - check_isnan ("imag(csinh(0 - i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, minus_infty)); - check_exc ("real(csinh(-0 - i Inf)) = +-0 plus invalid exception", - FUNC(fabs) (__real__ result), 0, INVALID_EXCEPTION); - check_isnan ("imag(csinh(-0 - i Inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, 0.0)); - check_isinfp ("real(csinh(+Inf + 0i)) = +Inf", __real__ result); - check ("imag(csinh(+Inf + 0i)) = 0", __imag__ result, 0); - result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, 0.0)); - check_isinfn ("real(csinh(-Inf + 0i)) = -Inf", __real__ result); - check ("imag(csinh(-Inf + 0i)) = 0", __imag__ result, 0); - result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isinfp ("real(csinh(+Inf - 0i)) = +Inf", __real__ result); - check ("imag(csinh(+Inf - 0i)) = -0", __imag__ result, minus_zero); - result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, minus_zero)); - check_isinfn ("real(csinh(-Inf - 0i)) = -Inf", __real__ result); - check ("imag(csinh(-Inf - 0i)) = -0", __imag__ result, minus_zero); - - result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isinfp_exc ("real(csinh(+Inf + i Inf)) = +-Inf plus invalid exception", - FUNC(fabs) (__real__ result), INVALID_EXCEPTION); - check_isnan ("imag(csinh(+Inf + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, plus_infty)); - check_isinfp_exc ("real(csinh(-Inf + i Inf)) = +-Inf plus invalid exception", - FUNC(fabs) (__real__ result), INVALID_EXCEPTION); - check_isnan ("imag(csinh(-Inf + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isinfp_exc ("real(csinh(Inf - i Inf)) = +-Inf plus invalid exception", - FUNC(fabs) (__real__ result), INVALID_EXCEPTION); - check_isnan ("imag(csinh(Inf - i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, minus_infty)); - check_isinfp_exc ("real(csinh(-Inf - i Inf)) = +-Inf plus invalid exception", - FUNC(fabs) (__real__ result), INVALID_EXCEPTION); - check_isnan ("imag(csinh(-Inf - i Inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, 4.625)); - check_isinfn ("real(csinh(+Inf + i4.625)) = -Inf", __real__ result); - check_isinfn ("imag(csinh(+Inf + i4.625)) = -Inf", __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, 4.625)); - check_isinfp ("real(csinh(-Inf + i4.625)) = +Inf", __real__ result); - check_isinfn ("imag(csinh(-Inf + i4.625)) = -Inf", __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, -4.625)); - check_isinfn ("real(csinh(+Inf - i4.625)) = -Inf", __real__ result); - check_isinfp ("imag(csinh(+Inf - i4.625)) = +Inf", __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, -4.625)); - check_isinfp ("real(csinh(-Inf - i4.625)) = +Inf", __real__ result); - check_isinfp ("imag(csinh(-Inf - i4.625)) = +Inf", __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (6.75, plus_infty)); - check_isnan_exc ("real(csinh(6.75 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(6.75 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (-6.75, plus_infty)); - check_isnan_exc ("real(csinh(-6.75 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(-6.75 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (6.75, minus_infty)); - check_isnan_exc ("real(csinh(6.75 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(6.75 - i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (-6.75, minus_infty)); - check_isnan_exc ("real(csinh(-6.75 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(-6.75 - i Inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (0.0, nan_value)); - check ("real(csinh(0 + i NaN)) = +-0", FUNC(fabs) (__real__ result), 0); - check_isnan ("imag(csinh(0 + i NaN)) = NaN", __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (minus_zero, nan_value)); - check ("real(csinh(-0 + i NaN)) = +-0", FUNC(fabs) (__real__ result), 0); - check_isnan ("imag(csinh(-0 + i NaN)) = NaN", __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isinfp ("real(csinh(+Inf + i NaN)) = +-Inf", - FUNC(fabs) (__real__ result)); - check_isnan ("imag(csinh(+Inf + i NaN)) = NaN", __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isinfp ("real(csinh(-Inf + i NaN)) = +-Inf", - FUNC(fabs) (__real__ result)); - check_isnan ("imag(csinh(-Inf + i NaN)) = NaN", __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (9.0, nan_value)); - check_isnan_maybe_exc ("real(csinh(9.0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(9.0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (-9.0, nan_value)); - check_isnan_maybe_exc ("real(csinh(-9.0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(-9.0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (nan_value, 0.0)); - check_isnan ("real(csinh(NaN + i0)) = NaN", __real__ result); - check ("imag(csinh(NaN + i0)) = 0", __imag__ result, 0.0); - result = FUNC(csinh) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan ("real(csinh(NaN - i0)) = NaN", __real__ result); - check ("imag(csinh(NaN - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(csinh) (BUILD_COMPLEX (nan_value, 10.0)); - check_isnan_maybe_exc ("real(csinh(NaN + i10)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(NaN + i10)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (nan_value, -10.0)); - check_isnan_maybe_exc ("real(csinh(NaN - i10)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(NaN - i10)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isnan_maybe_exc ("real(csinh(NaN + i Inf)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(NaN + i Inf)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csinh) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isnan_maybe_exc ("real(csinh(NaN - i Inf)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csinh(NaN - i Inf)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(csinh(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(csinh(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(csinh) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(csinh(0.7 + i 1.2)) = 0.274878686...", __real__ result, - 0.27487868678117583582L, CHOOSE (2e-17L, 6e-17, 3e-8)); - check_eps ("imag(csinh(0.7 + i 1.2)) = 1.169866572...", __imag__ result, - 1.1698665727426565139L, CHOOSE (6e-17L, 2.3e-16, 2e-7)); - - result = FUNC(csinh) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(csinh(-2 - i 3)) == -3.59056...", __real__ result, - 3.5905645899857799520L, CHOOSE (7e-19L, 5e-16, 3e-7)); - check_eps ("imag(csinh(-2 - i 3)) == -0.53092...", __imag__ result, - -0.5309210862485198052L, CHOOSE (3e-19L, 2e-16, 6e-8)); -} - - -static void -ccos_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(ccos) (BUILD_COMPLEX (0.0, 0.0)); - check ("real(ccos(0 + 0i)) = 1.0", __real__ result, 1.0); - check ("imag(ccos(0 + 0i)) = -0", __imag__ result, minus_zero); - result = FUNC(ccos) (BUILD_COMPLEX (minus_zero, 0.0)); - check ("real(ccos(-0 + 0i)) = 1.0", __real__ result, 1.0); - check ("imag(ccos(-0 + 0i)) = 0", __imag__ result, 0.0); - result = FUNC(ccos) (BUILD_COMPLEX (0.0, minus_zero)); - check ("real(ccos(0 - 0i)) = 1.0", __real__ result, 1.0); - check ("imag(ccos(0 - 0i)) = 0", __imag__ result, 0.0); - result = FUNC(ccos) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(ccos(-0 - 0i)) = 1.0", __real__ result, 1.0); - check ("imag(ccos(-0 - 0i)) = -0", __imag__ result, minus_zero); - - result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, 0.0)); - check_isnan_exc ("real(ccos(+Inf + i0)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(ccos(Inf + i0)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isnan_exc ("real(ccos(Inf - i0)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(ccos(Inf - i0)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, 0.0)); - check_isnan_exc ("real(ccos(-Inf + i0)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(ccos(-Inf + i0)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, minus_zero)); - check_isnan_exc ("real(ccos(-Inf - i0)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(ccos(-Inf - i0)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - - result = FUNC(ccos) (BUILD_COMPLEX (0.0, plus_infty)); - check_isinfp ("real(ccos(0 + i Inf)) = +Inf", __real__ result); - check ("imag(ccos(0 + i Inf)) = -0", __imag__ result, minus_zero); - result = FUNC(ccos) (BUILD_COMPLEX (0.0, minus_infty)); - check_isinfp ("real(ccos(0 - i Inf)) = +Inf", __real__ result); - check ("imag(ccos(0 - i Inf)) = 0", __imag__ result, 0); - result = FUNC(ccos) (BUILD_COMPLEX (minus_zero, plus_infty)); - check_isinfp ("real(ccos(-0 + i Inf)) = +Inf", __real__ result); - check ("imag(ccos(-0 + i Inf)) = 0", __imag__ result, 0.0); - result = FUNC(ccos) (BUILD_COMPLEX (minus_zero, minus_infty)); - check_isinfp ("real(ccos(-0 - i Inf)) = +Inf", __real__ result); - check ("imag(ccos(-0 - i Inf)) = -0", __imag__ result, minus_zero); - - result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isinfp_exc ("real(ccos(+Inf + i Inf)) = +Inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(+Inf + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, plus_infty)); - check_isinfp_exc ("real(ccos(-Inf + i Inf)) = +Inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(-Inf + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isinfp_exc ("real(ccos(Inf - i Inf)) = +Inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(Inf - i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, minus_infty)); - check_isinfp_exc ("real(ccos(-Inf - i Inf)) = +Inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(-Inf - i Inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(ccos) (BUILD_COMPLEX (4.625, plus_infty)); - check_isinfn ("real(ccos(4.625 + i Inf)) = -Inf", __real__ result); - check_isinfp ("imag(ccos(4.625 + i Inf)) = +Inf", __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (4.625, minus_infty)); - check_isinfn ("real(ccos(4.625 - i Inf)) = -Inf", __real__ result); - check_isinfn ("imag(ccos(4.625 - i Inf)) = -Inf", __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (-4.625, plus_infty)); - check_isinfn ("real(ccos(-4.625 + i Inf)) = -Inf", __real__ result); - check_isinfn ("imag(ccos(-4.625 + i Inf)) = -Inf", __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (-4.625, minus_infty)); - check_isinfn ("real(ccos(-4.625 - i Inf)) = -Inf", __real__ result); - check_isinfp ("imag(ccos(-4.625 - i Inf)) = +Inf", __imag__ result); - - result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, 6.75)); - check_isnan_exc ("real(ccos(+Inf + i6.75)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(+Inf + i6.75)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, -6.75)); - check_isnan_exc ("real(ccos(+Inf - i6.75)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(+Inf - i6.75)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, 6.75)); - check_isnan_exc ("real(ccos(-Inf + i6.75)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(-Inf + i6.75)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, -6.75)); - check_isnan_exc ("real(ccos(-Inf - i6.75)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(-Inf - i6.75)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(ccos) (BUILD_COMPLEX (nan_value, 0.0)); - check_isnan ("real(ccos(NaN + i0)) = NaN", __real__ result); - check ("imag(ccos(NaN + i0)) = +-0", FUNC(fabs) (__imag__ result), 0); - result = FUNC(ccos) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan ("real(ccos(NaN - i0)) = NaN", __real__ result); - check ("imag(ccos(NaN - i0)) = +-0", FUNC(fabs) (__imag__ result), 0); - - result = FUNC(ccos) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isinfp ("real(ccos(NaN + i Inf)) = +Inf", __real__ result); - check_isnan ("imag(ccos(NaN + i Inf)) = NaN", __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isinfp ("real(ccos(NaN - i Inf)) = +Inf", __real__ result); - check_isnan ("imag(ccos(NaN - i Inf)) = NaN", __imag__ result); - - result = FUNC(ccos) (BUILD_COMPLEX (nan_value, 9.0)); - check_isnan_maybe_exc ("real(ccos(NaN + i9.0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(NaN + i9.0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (nan_value, -9.0)); - check_isnan_maybe_exc ("real(ccos(NaN - i9.0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(NaN - i9.0)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ccos) (BUILD_COMPLEX (0.0, nan_value)); - check_isnan ("real(ccos(0 + i NaN)) = NaN", __real__ result); - check ("imag(ccos(0 + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0.0); - result = FUNC(ccos) (BUILD_COMPLEX (minus_zero, nan_value)); - check_isnan ("real(ccos(-0 + i NaN)) = NaN", __real__ result); - check ("imag(ccos(-0 + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0.0); - - result = FUNC(ccos) (BUILD_COMPLEX (10.0, nan_value)); - check_isnan_maybe_exc ("real(ccos(10 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(10 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (-10.0, nan_value)); - check_isnan_maybe_exc ("real(ccos(-10 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(-10 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ccos) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isnan_maybe_exc ("real(ccos(+Inf + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(+Inf + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ccos) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isnan_maybe_exc ("real(ccos(-Inf + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccos(-Inf + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ccos) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(ccos(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(ccos(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(ccos) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(ccos(0.7 + i 1.2)) = 1.384865764...", __real__ result, - 1.3848657645312111080L, CHOOSE (4e-18L, 3e-16, 2e-7)); - check_eps ("imag(ccos(0.7 + i 1.2)) = -0.972421703...", __imag__ result, - -0.97242170335830028619L, CHOOSE (2e-16L, 2e-16, 0)); - - result = FUNC(ccos) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(ccos(-2 - i 3)) == -4.18962...", __real__ result, - -4.1896256909688072301L, CHOOSE (2e-17L, 8.9e-16, 5e-7)); - check_eps ("imag(ccos(-2 - i 3)) == -9.10922...", __imag__ result, - -9.1092278937553365979L, CHOOSE (3e-18L, 0, 1e-6)); -} - - -static void -ccosh_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(ccosh) (BUILD_COMPLEX (0.0, 0.0)); - check ("real(ccosh(0 + 0i)) = 1.0", __real__ result, 1.0); - check ("imag(ccosh(0 + 0i)) = 0", __imag__ result, 0); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, 0.0)); - check ("real(ccosh(-0 + 0i)) = 1.0", __real__ result, 1.0); - check ("imag(ccosh(-0 + 0i)) = -0", __imag__ result, minus_zero); - result = FUNC(ccosh) (BUILD_COMPLEX (0.0, minus_zero)); - check ("real(ccosh(0 - 0i)) = 1.0", __real__ result, 1.0); - check ("imag(ccosh(0 - 0i)) = -0", __imag__ result, minus_zero); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(ccosh(-0 - 0i)) = 1.0", __real__ result, 1.0); - check ("imag(ccosh(-0 - 0i)) = 0", __imag__ result, 0.0); - - result = FUNC(ccosh) (BUILD_COMPLEX (0.0, plus_infty)); - check_isnan_exc ("real(ccosh(0 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(ccosh(0 + i Inf)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, plus_infty)); - check_isnan_exc ("real(ccosh(-0 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(ccosh(-0 + i Inf)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - result = FUNC(ccosh) (BUILD_COMPLEX (0.0, minus_infty)); - check_isnan_exc ("real(ccosh(0 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(ccosh(0 - i Inf)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, minus_infty)); - check_isnan_exc ("real(ccosh(-0 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check ("imag(ccosh(-0 - i Inf)) = +-0 plus invalid exception", - FUNC(fabs) (__imag__ result), 0); - - result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, 0.0)); - check_isinfp ("real(ccosh(+Inf + 0i)) = +Inf", __real__ result); - check ("imag(ccosh(+Inf + 0i)) = 0", __imag__ result, 0); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, 0.0)); - check_isinfp ("real(ccosh(-Inf + 0i)) = +Inf", __real__ result); - check ("imag(ccosh(-Inf + 0i)) = -0", __imag__ result, minus_zero); - result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isinfp ("real(ccosh(+Inf - 0i)) = +Inf", __real__ result); - check ("imag(ccosh(+Inf - 0i)) = -0", __imag__ result, minus_zero); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, minus_zero)); - check_isinfp ("real(ccosh(-Inf - 0i)) = +Inf", __real__ result); - check ("imag(ccosh(-Inf - 0i)) = 0", __imag__ result, 0.0); - - result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isinfp_exc ("real(ccosh(+Inf + i Inf)) = +Inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(+Inf + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, plus_infty)); - check_isinfp_exc ("real(ccosh(-Inf + i Inf)) = +Inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(-Inf + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isinfp_exc ("real(ccosh(Inf - i Inf)) = +Inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(Inf - i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, minus_infty)); - check_isinfp_exc ("real(ccosh(-Inf - i Inf)) = +Inf plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(-Inf - i Inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, 4.625)); - check_isinfn ("real(ccosh(+Inf + i4.625)) = -Inf", __real__ result); - check_isinfn ("imag(ccosh(+Inf + i4.625)) = -Inf", __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, 4.625)); - check_isinfn ("real(ccosh(-Inf + i4.625)) = -Inf", __real__ result); - check_isinfp ("imag(ccosh(-Inf + i4.625)) = Inf", __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, -4.625)); - check_isinfn ("real(ccosh(+Inf - i4.625)) = -Inf", __real__ result); - check_isinfp ("imag(ccosh(+Inf - i4.625)) = +Inf", __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, -4.625)); - check_isinfn ("real(ccosh(-Inf - i4.625)) = -Inf", __real__ result); - check_isinfn ("imag(ccosh(-Inf - i4.625)) = -Inf", __imag__ result); - - result = FUNC(ccosh) (BUILD_COMPLEX (6.75, plus_infty)); - check_isnan_exc ("real(ccosh(6.75 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(6.75 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (-6.75, plus_infty)); - check_isnan_exc ("real(ccosh(-6.75 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(-6.75 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (6.75, minus_infty)); - check_isnan_exc ("real(ccosh(6.75 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(6.75 - i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (-6.75, minus_infty)); - check_isnan_exc ("real(ccosh(-6.75 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(-6.75 - i Inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(ccosh) (BUILD_COMPLEX (0.0, nan_value)); - check_isnan ("real(ccosh(0 + i NaN)) = NaN", __real__ result); - check ("imag(ccosh(0 + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_zero, nan_value)); - check_isnan ("real(ccosh(-0 + i NaN)) = NaN", __real__ result); - check ("imag(ccosh(-0 + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0); - - result = FUNC(ccosh) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isinfp ("real(ccosh(+Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(ccosh(+Inf + i NaN)) = NaN", __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isinfp ("real(ccosh(-Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(ccosh(-Inf + i NaN)) = NaN", __imag__ result); - - result = FUNC(ccosh) (BUILD_COMPLEX (9.0, nan_value)); - check_isnan_maybe_exc ("real(ccosh(9.0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(9.0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (-9.0, nan_value)); - check_isnan_maybe_exc ("real(ccosh(-9.0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(-9.0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, 0.0)); - check_isnan ("real(ccosh(NaN + i0)) = NaN", __real__ result); - check ("imag(ccosh(NaN + i0)) = +-0", FUNC(fabs) (__imag__ result), 0.0); - result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan ("real(ccosh(NaN - i0)) = NaN", __real__ result); - check ("imag(ccosh(NaN - i0)) = +-0", FUNC(fabs) (__imag__ result), 0.0); - - result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, 10.0)); - check_isnan_maybe_exc ("real(ccosh(NaN + i10)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(NaN + i10)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, -10.0)); - check_isnan_maybe_exc ("real(ccosh(NaN - i10)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(NaN - i10)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isnan_maybe_exc ("real(ccosh(NaN + i Inf)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(NaN + i Inf)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isnan_maybe_exc ("real(ccosh(NaN - i Inf)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ccosh(NaN - i Inf)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ccosh) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(ccosh(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(ccosh(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(ccosh) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(ccosh(0.7 + i 1.2)) == 0.45482...", __real__ result, - 0.4548202223691477654L, CHOOSE (5e-17L, 6e-17, 9e-8)); - check_eps ("imag(ccosh(0.7 + i 1.2)) == 0.70702...", __imag__ result, - 0.7070296600921537682L, CHOOSE (7e-17L, 2e-16, 6e-8)); - - result = FUNC(ccosh) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(ccosh(-2 - i 3)) == -3.72454...", __real__ result, - -3.7245455049153225654L, CHOOSE (7e-19L, 4.5e-16, 3e-7)); - check_eps ("imag(ccosh(-2 - i 3)) == -0.51182...", __imag__ result, - 0.5118225699873846088L, CHOOSE (3e-19L, 2e-16, 6e-8)); -} - - -static void -cacos_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(cacos) (BUILD_COMPLEX (0, 0)); - check ("real(cacos(0 + i0)) = pi/2", __real__ result, M_PI_2l); - check ("imag(cacos(0 + i0)) = -0", __imag__ result, minus_zero); - result = FUNC(cacos) (BUILD_COMPLEX (minus_zero, 0)); - check ("real(cacos(-0 + i0)) = pi/2", __real__ result, M_PI_2l); - check ("imag(cacos(-0 + i0)) = -0", __imag__ result, minus_zero); - result = FUNC(cacos) (BUILD_COMPLEX (0, minus_zero)); - check ("real(cacos(0 - i0)) = pi/2", __real__ result, M_PI_2l); - check ("imag(cacos(0 - i0)) = 0", __imag__ result, 0); - result = FUNC(cacos) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(cacos(-0 - i0)) = pi/2", __real__ result, M_PI_2l); - check ("imag(cacos(-0 - i0)) = 0", __imag__ result, 0); - - result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, plus_infty)); - check ("real(cacos(-Inf + i Inf)) = 3*pi/4", __real__ result, - M_PIl - M_PI_4l); - check_isinfn ("imag(cacos(-Inf + i Inf)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, minus_infty)); - check ("real(cacos(-Inf - i Inf)) = 3*pi/4", __real__ result, - M_PIl - M_PI_4l); - check_isinfp ("imag(cacos(-Inf - i Inf)) = +Inf", __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, plus_infty)); - check ("real(cacos(+Inf + i Inf)) = pi/4", __real__ result, M_PI_4l); - check_isinfn ("imag(cacos(+Inf + i Inf)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, minus_infty)); - check ("real(cacos(+Inf - i Inf)) = pi/4", __real__ result, M_PI_4l); - check_isinfp ("imag(cacos(+Inf - i Inf)) = +Inf", __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (-10.0, plus_infty)); - check ("real(cacos(-10.0 + i Inf)) = pi/2", __real__ result, M_PI_2l); - check_isinfn ("imag(cacos(-10.0 + i Inf)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (-10.0, minus_infty)); - check ("real(cacos(-10.0 - i Inf)) = pi/2", __real__ result, M_PI_2l); - check_isinfp ("imag(cacos(-10.0 - i Inf)) = +Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (0, plus_infty)); - check ("real(cacos(0 + i Inf)) = pi/2", __real__ result, M_PI_2l); - check_isinfn ("imag(cacos(0 + i Inf)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (0, minus_infty)); - check ("real(cacos(0 - i Inf)) = pi/2", __real__ result, M_PI_2l); - check_isinfp ("imag(cacos(0 - i Inf)) = +Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (0.1, plus_infty)); - check ("real(cacos(0.1 + i Inf)) = pi/2", __real__ result, M_PI_2l); - check_isinfn ("imag(cacos(0.1 + i Inf)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (0.1, minus_infty)); - check ("real(cacos(0.1 - i Inf)) = pi/2", __real__ result, M_PI_2l); - check_isinfp ("imag(cacos(0.1 - i Inf)) = +Inf", __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, 0)); - check ("real(cacos(-Inf + i0)) = pi", __real__ result, M_PIl); - check_isinfn ("imag(cacos(-Inf + i0)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, minus_zero)); - check ("real(cacos(-Inf - i0)) = pi", __real__ result, M_PIl); - check_isinfp ("imag(cacos(-Inf - i0)) = +Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, 100)); - check ("real(cacos(-Inf + i100)) = pi", __real__ result, M_PIl); - check_isinfn ("imag(cacos(-Inf + i100)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, -100)); - check ("real(cacos(-Inf - i100)) = pi", __real__ result, M_PIl); - check_isinfp ("imag(cacos(-Inf - i100)) = +Inf", __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, 0)); - check ("real(cacos(+Inf + i0)) = 0", __real__ result, 0); - check_isinfn ("imag(cacos(+Inf + i0)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, minus_zero)); - check ("real(cacos(+Inf - i0)) = 0", __real__ result, 0); - check_isinfp ("imag(cacos(+Inf - i0)) = +Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, 0.5)); - check ("real(cacos(+Inf + i0.5)) = 0", __real__ result, 0); - check_isinfn ("imag(cacos(+Inf + i0.5)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, -0.5)); - check ("real(cacos(+Inf - i0.5)) = 0", __real__ result, 0); - check_isinfp ("imag(cacos(+Inf - i0.5)) = +Inf", __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isnan ("real(cacos(+Inf + i NaN)) = NaN", __real__ result); - check_isinfp ("imag(cacos(+Inf + i NaN)) = +-Inf", - FUNC(fabs) (__imag__ result)); - result = FUNC(cacos) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isnan ("real(cacos(-Inf + i NaN)) = NaN", __real__ result); - check_isinfp ("imag(cacos(-Inf + i NaN)) = +-Inf", - FUNC(fabs) (__imag__ result)); - - result = FUNC(cacos) (BUILD_COMPLEX (0, nan_value)); - check ("real(cacos(0 + i NaN)) = pi/2", __real__ result, M_PI_2l); - check_isnan ("imag(cacos(0 + i NaN)) = NaN", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (minus_zero, nan_value)); - check ("real(cacos(-0 + i NaN)) = pi/2", __real__ result, M_PI_2l); - check_isnan ("imag(cacos(-0 + i NaN)) = NaN", __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isnan ("real(cacos(NaN + i Inf)) = NaN", __real__ result); - check_isinfn ("imag(cacos(NaN + i Inf)) = -Inf", __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isnan ("real(cacos(NaN - i Inf)) = NaN", __real__ result); - check_isinfp ("imag(cacos(NaN - i Inf)) = +Inf", __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (10.5, nan_value)); - check_isnan_maybe_exc ("real(cacos(10.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cacos(10.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (-10.5, nan_value)); - check_isnan_maybe_exc ("real(cacos(-10.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cacos(-10.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (nan_value, 0.75)); - check_isnan_maybe_exc ("real(cacos(NaN + i0.75)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cacos(NaN + i0.75)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(cacos) (BUILD_COMPLEX (-10.5, nan_value)); - check_isnan_maybe_exc ("real(cacos(NaN - i0.75)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cacos(NaN - i0.75)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(cacos(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(cacos(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(cacos) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(cacos(0.7 + i 1.2)) == 1.13518...", __real__ result, - 1.1351827477151551089L, CHOOSE (2e-17L, 3e-16, 2e-7)); - check_eps ("imag(cacos(0.7 + i 1.2)) == -1.09276...", __imag__ result, - -1.0927647857577371459L, CHOOSE (4e-17L, 3e-16, 3e-7)); - - result = FUNC(cacos) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(cacos(-2 - i 3)) == 2.14144...", __real__ result, - 2.1414491111159960199L, CHOOSE (3e-19L, 0, 0)); - check_eps ("imag(cacos(-2 - i 3)) == -1.98338...", __imag__ result, - 1.9833870299165354323L, CHOOSE (3e-19L, 0, 0)); -} - - -static void -cacosh_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(cacosh) (BUILD_COMPLEX (0, 0)); - check ("real(cacosh(0 + i0)) = 0", __real__ result, 0); - check ("imag(cacosh(0 + i0)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(cacosh) (BUILD_COMPLEX (minus_zero, 0)); - check ("real(cacosh(-0 + i0)) = 0", __real__ result, 0); - check ("imag(cacosh(-0 + i0)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(cacosh) (BUILD_COMPLEX (0, minus_zero)); - check ("real(cacosh(0 - i0)) = 0", __real__ result, 0); - check ("imag(cacosh(0 - i0)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(cacosh) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(cacosh(-0 - i0)) = 0", __real__ result, 0); - check ("imag(cacosh(-0 - i0)) = -pi/2", __imag__ result, -M_PI_2l); - - result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, plus_infty)); - check_isinfp ("real(cacosh(-Inf + i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(-Inf + i Inf)) = 3*pi/4", __imag__ result, - M_PIl - M_PI_4l); - result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, minus_infty)); - check_isinfp ("real(cacosh(-Inf - i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(-Inf - i Inf)) = -3*pi/4", __imag__ result, - M_PI_4l - M_PIl); - - result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isinfp ("real(cacosh(+Inf + i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(+Inf + i Inf)) = pi/4", __imag__ result, M_PI_4l); - result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isinfp ("real(cacosh(+Inf - i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(+Inf - i Inf)) = -pi/4", __imag__ result, -M_PI_4l); - - result = FUNC(cacosh) (BUILD_COMPLEX (-10.0, plus_infty)); - check_isinfp ("real(cacosh(-10.0 + i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(-10.0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(cacosh) (BUILD_COMPLEX (-10.0, minus_infty)); - check_isinfp ("real(cacosh(-10.0 - i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(-10.0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(cacosh) (BUILD_COMPLEX (0, plus_infty)); - check_isinfp ("real(cacosh(0 + i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(cacosh) (BUILD_COMPLEX (0, minus_infty)); - check_isinfp ("real(cacosh(0 - i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(cacosh) (BUILD_COMPLEX (0.1, plus_infty)); - check_isinfp ("real(cacosh(0.1 + i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(0.1 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(cacosh) (BUILD_COMPLEX (0.1, minus_infty)); - check_isinfp ("real(cacosh(0.1 - i Inf)) = +Inf", __real__ result); - check ("imag(cacosh(0.1 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - - result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, 0)); - check_isinfp ("real(cacosh(-Inf + i0)) = +Inf", __real__ result); - check ("imag(cacosh(-Inf + i0)) = pi", __imag__ result, M_PIl); - result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, minus_zero)); - check_isinfp ("real(cacosh(-Inf - i0)) = +Inf", __real__ result); - check ("imag(cacosh(-Inf - i0)) = -pi", __imag__ result, -M_PIl); - result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, 100)); - check_isinfp ("real(cacosh(-Inf + i100)) = +Inf", __real__ result); - check ("imag(cacosh(-Inf + i100)) = pi", __imag__ result, M_PIl); - result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, -100)); - check_isinfp ("real(cacosh(-Inf - i100)) = +Inf", __real__ result); - check ("imag(cacosh(-Inf - i100)) = -pi", __imag__ result, -M_PIl); - - result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, 0)); - check_isinfp ("real(cacosh(+Inf + i0)) = +Inf", __real__ result); - check ("imag(cacosh(+Inf + i0)) = 0", __imag__ result, 0); - result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isinfp ("real(cacosh(+Inf - i0)) = +Inf", __real__ result); - check ("imag(cacosh(+Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, 0.5)); - check_isinfp ("real(cacosh(+Inf + i0.5)) = +Inf", __real__ result); - check ("imag(cacosh(+Inf + i0.5)) = 0", __imag__ result, 0); - result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, -0.5)); - check_isinfp ("real(cacosh(+Inf - i0.5)) = +Inf", __real__ result); - check ("imag(cacosh(+Inf - i0.5)) = -0", __imag__ result, minus_zero); - - result = FUNC(cacosh) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isinfp ("real(cacosh(+Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(cacosh(+Inf + i NaN)) = NaN", __imag__ result); - result = FUNC(cacosh) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isinfp ("real(cacosh(-Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(cacosh(-Inf + i NaN)) = NaN", __imag__ result); - - result = FUNC(cacosh) (BUILD_COMPLEX (0, nan_value)); - check_isnan ("real(cacosh(0 + i NaN)) = NaN", __real__ result); - check_isnan ("imag(cacosh(0 + i NaN)) = NaN", __imag__ result); - result = FUNC(cacosh) (BUILD_COMPLEX (minus_zero, nan_value)); - check_isnan ("real(cacosh(-0 + i NaN)) = NaN", __real__ result); - check_isnan ("imag(cacosh(-0 + i NaN)) = NaN", __imag__ result); - - result = FUNC(cacosh) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isinfp ("real(cacosh(NaN + i Inf)) = +Inf", __real__ result); - check_isnan ("imag(cacosh(NaN + i Inf)) = NaN", __imag__ result); - result = FUNC(cacosh) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isinfp ("real(cacosh(NaN - i Inf)) = +Inf", __real__ result); - check_isnan ("imag(cacosh(NaN - i Inf)) = NaN", __imag__ result); - - result = FUNC(cacosh) (BUILD_COMPLEX (10.5, nan_value)); - check_isnan_maybe_exc ("real(cacosh(10.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cacosh(10.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(cacosh) (BUILD_COMPLEX (-10.5, nan_value)); - check_isnan_maybe_exc ("real(cacosh(-10.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cacosh(-10.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(cacosh) (BUILD_COMPLEX (nan_value, 0.75)); - check_isnan_maybe_exc ("real(cacosh(NaN + i0.75)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cacosh(NaN + i0.75)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(cacosh) (BUILD_COMPLEX (-10.5, nan_value)); - check_isnan_maybe_exc ("real(cacosh(NaN - i0.75)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(cacosh(NaN - i0.75)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(cacosh) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(cacosh(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(cacosh(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(cacosh) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(cacosh(0.7 + i 1.2)) == 1.09276...", __real__ result, - 1.0927647857577371459L, CHOOSE (4e-17L, 3e-16, 2e-7)); - check_eps ("imag(cacosh(0.7 + i 1.2)) == 1.13518...", __imag__ result, - 1.1351827477151551089L, CHOOSE (2e-17L, 0, 1.2e-7)); - - result = FUNC(cacosh) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(cacosh(-2 - i 3)) == -1.98338...", __real__ result, - -1.9833870299165354323L, CHOOSE (2e-18L, 3e-16, 9e-7)); - check_eps ("imag(cacosh(-2 - i 3)) == 2.14144...", __imag__ result, - 2.1414491111159960199L, CHOOSE (4.5e-19, 5e-16, 1e-6)); -} - - -static void -casin_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(casin) (BUILD_COMPLEX (0, 0)); - check ("real(casin(0 + i0)) = 0", __real__ result, 0); - check ("imag(casin(0 + i0)) = 0", __imag__ result, 0); - result = FUNC(casin) (BUILD_COMPLEX (minus_zero, 0)); - check ("real(casin(-0 + i0)) = -0", __real__ result, minus_zero); - check ("imag(casin(-0 + i0)) = 0", __imag__ result, 0); - result = FUNC(casin) (BUILD_COMPLEX (0, minus_zero)); - check ("real(casin(0 - i0)) = 0", __real__ result, 0); - check ("imag(casin(0 - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(casin) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(casin(-0 - i0)) = -0", __real__ result, minus_zero); - check ("imag(casin(-0 - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(casin) (BUILD_COMPLEX (plus_infty, plus_infty)); - check ("real(casin(+Inf + i Inf)) = pi/4", __real__ result, M_PI_4l); - check_isinfp ("imag(casin(+Inf + i Inf)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (plus_infty, minus_infty)); - check ("real(casin(+Inf - i Inf)) = pi/4", __real__ result, M_PI_4l); - check_isinfn ("imag(casin(+Inf - i Inf)) = -Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (minus_infty, plus_infty)); - check ("real(casin(-Inf + i Inf)) = -pi/4", __real__ result, -M_PI_4l); - check_isinfp ("imag(casin(-Inf + i Inf)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (minus_infty, minus_infty)); - check ("real(casin(-Inf - i Inf)) = -pi/4", __real__ result, -M_PI_4l); - check_isinfn ("imag(casin(-Inf - i Inf)) = -Inf", __imag__ result); - - result = FUNC(casin) (BUILD_COMPLEX (-10.0, plus_infty)); - check ("real(casin(-10.0 + i Inf)) = -0", __real__ result, minus_zero); - check_isinfp ("imag(casin(-10.0 + i Inf)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (-10.0, minus_infty)); - check ("real(casin(-10.0 - i Inf)) = -0", __real__ result, minus_zero); - check_isinfn ("imag(casin(-10.0 - i Inf)) = -Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (0, plus_infty)); - check ("real(casin(0 + i Inf)) = 0", __real__ result, 0.0); - check_isinfp ("imag(casin(0 + i Inf)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (0, minus_infty)); - check ("real(casin(0 - i Inf)) = 0", __real__ result, 0.0); - check_isinfn ("imag(casin(0 - i Inf)) = -Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (minus_zero, plus_infty)); - check ("real(casin(-0 + i Inf)) = -0", __real__ result, minus_zero); - check_isinfp ("imag(casin(-0 + i Inf)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (minus_zero, minus_infty)); - check ("real(casin(-0 - i Inf)) = -0", __real__ result, minus_zero); - check_isinfn ("imag(casin(-0 - i Inf)) = -Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (0.1, plus_infty)); - check ("real(casin(0.1 + i Inf)) = 0", __real__ result, 0); - check_isinfp ("imag(casin(0.1 + i Inf)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (0.1, minus_infty)); - check ("real(casin(0.1 - i Inf)) = 0", __real__ result, 0); - check_isinfn ("imag(casin(0.1 - i Inf)) = -Inf", __imag__ result); - - result = FUNC(casin) (BUILD_COMPLEX (minus_infty, 0)); - check ("real(casin(-Inf + i0)) = -pi/2", __real__ result, -M_PI_2l); - check_isinfp ("imag(casin(-Inf + i0)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (minus_infty, minus_zero)); - check ("real(casin(-Inf - i0)) = -pi/2", __real__ result, -M_PI_2l); - check_isinfn ("imag(casin(-Inf - i0)) = -Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (minus_infty, 100)); - check ("real(casin(-Inf + i100)) = -pi/2", __real__ result, -M_PI_2l); - check_isinfp ("imag(casin(-Inf + i100)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (minus_infty, -100)); - check ("real(casin(-Inf - i100)) = -pi/2", __real__ result, -M_PI_2l); - check_isinfn ("imag(casin(-Inf - i100)) = -Inf", __imag__ result); - - result = FUNC(casin) (BUILD_COMPLEX (plus_infty, 0)); - check ("real(casin(+Inf + i0)) = pi/2", __real__ result, M_PI_2l); - check_isinfp ("imag(casin(+Inf + i0)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (plus_infty, minus_zero)); - check ("real(casin(+Inf - i0)) = pi/2", __real__ result, M_PI_2l); - check_isinfn ("imag(casin(+Inf - i0)) = -Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (plus_infty, 0.5)); - check ("real(casin(+Inf + i0.5)) = pi/2", __real__ result, M_PI_2l); - check_isinfp ("imag(casin(+Inf + i0.5)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (plus_infty, -0.5)); - check ("real(casin(+Inf - i0.5)) = pi/2", __real__ result, M_PI_2l); - check_isinfn ("imag(casin(+Inf - i0.5)) = -Inf", __imag__ result); - - result = FUNC(casin) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isnan ("real(casin(NaN + i Inf)) = NaN", __real__ result); - check_isinfp ("imag(casin(NaN + i Inf)) = +Inf", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isnan ("real(casin(NaN - i Inf)) = NaN", __real__ result); - check_isinfn ("imag(casin(NaN - i Inf)) = -Inf", __imag__ result); - - result = FUNC(casin) (BUILD_COMPLEX (0.0, nan_value)); - check ("real(casin(0 + i NaN)) = 0", __real__ result, 0.0); - check_isnan ("imag(casin(0 + i NaN)) = NaN", __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (minus_zero, nan_value)); - check ("real(casin(-0 + i NaN)) = -0", __real__ result, minus_zero); - check_isnan ("imag(casin(-0 + i NaN)) = NaN", __imag__ result); - - result = FUNC(casin) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isnan ("real(casin(+Inf + i NaN)) = NaN", __real__ result); - check_isinfp ("imag(casin(+Inf + i NaN)) = +-Inf", - FUNC(fabs) (__imag__ result)); - result = FUNC(casin) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isnan ("real(casin(-Inf + i NaN)) = NaN", __real__ result); - check_isinfp ("imag(casin(-Inf + NaN)) = +-Inf", - FUNC(fabs) (__imag__ result)); - - result = FUNC(casin) (BUILD_COMPLEX (nan_value, 10.5)); - check_isnan_maybe_exc ("real(casin(NaN + i10.5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(casin(NaN + i10.5)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (nan_value, -10.5)); - check_isnan_maybe_exc ("real(casin(NaN - i10.5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(casin(NaN - i10.5)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(casin) (BUILD_COMPLEX (0.75, nan_value)); - check_isnan_maybe_exc ("real(casin(0.75 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(casin(0.75 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(casin) (BUILD_COMPLEX (-0.75, nan_value)); - check_isnan_maybe_exc ("real(casin(-0.75 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(casin(-0.75 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(casin) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(casin(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(casin(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(casin) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(casin(0.7 + i 1.2)) == 0.43561...", __real__ result, - 0.4356135790797415103L, CHOOSE (2e-17L, 2e-16, 2e-7)); - check_eps ("imag(casin(0.7 + i 1.2)) == 1.09276...", __imag__ result, - 1.0927647857577371459L, CHOOSE (4e-17L, 3e-16, 3e-7)); - - result = FUNC(casin) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(casin(-2 - i 3)) == -0.57065...", __real__ result, - -0.5706527843210994007L, CHOOSE (4e-19L, 0, 0)); - check_eps ("imag(casin(-2 - i 3)) == -1.98338...", __imag__ result, - -1.9833870299165354323L, CHOOSE (3e-19L, 0, 0)); -} - - -static void -casinh_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(casinh) (BUILD_COMPLEX (0, 0)); - check ("real(casinh(0 + i0)) = 0", __real__ result, 0); - check ("imag(casinh(0 + i0)) = 0", __imag__ result, 0); - result = FUNC(casinh) (BUILD_COMPLEX (minus_zero, 0)); - check ("real(casinh(-0 + i0)) = -0", __real__ result, minus_zero); - check ("imag(casinh(-0 + i0)) = 0", __imag__ result, 0); - result = FUNC(casinh) (BUILD_COMPLEX (0, minus_zero)); - check ("real(casinh(0 - i0)) = 0", __real__ result, 0); - check ("imag(casinh(0 - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(casinh) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(casinh(-0 - i0)) = -0", __real__ result, minus_zero); - check ("imag(casinh(-0 - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isinfp ("real(casinh(+Inf + i Inf)) = +Inf", __real__ result); - check ("imag(casinh(+Inf + i Inf)) = pi/4", __imag__ result, M_PI_4l); - result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isinfp ("real(casinh(+Inf - i Inf)) = +Inf", __real__ result); - check ("imag(casinh(+Inf - i Inf)) = -pi/4", __imag__ result, -M_PI_4l); - result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, plus_infty)); - check_isinfn ("real(casinh(-Inf + i Inf)) = -Inf", __real__ result); - check ("imag(casinh(-Inf + i Inf)) = pi/4", __imag__ result, M_PI_4l); - result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, minus_infty)); - check_isinfn ("real(casinh(-Inf - i Inf)) = -Inf", __real__ result); - check ("imag(casinh(-Inf - i Inf)) = -pi/4", __imag__ result, -M_PI_4l); - - result = FUNC(casinh) (BUILD_COMPLEX (-10.0, plus_infty)); - check_isinfn ("real(casinh(-10.0 + i Inf)) = -Inf", __real__ result); - check ("imag(casinh(-10.0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(casinh) (BUILD_COMPLEX (-10.0, minus_infty)); - check_isinfn ("real(casinh(-10.0 - i Inf)) = -Inf", __real__ result); - check ("imag(casinh(-10.0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(casinh) (BUILD_COMPLEX (0, plus_infty)); - check_isinfp ("real(casinh(0 + i Inf)) = +Inf", __real__ result); - check ("imag(casinh(0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(casinh) (BUILD_COMPLEX (0, minus_infty)); - check_isinfp ("real(casinh(0 - i Inf)) = +Inf", __real__ result); - check ("imag(casinh(0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(casinh) (BUILD_COMPLEX (minus_zero, plus_infty)); - check_isinfn ("real(casinh(-0 + i Inf)) = -Inf", __real__ result); - check ("imag(casinh(-0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(casinh) (BUILD_COMPLEX (minus_zero, minus_infty)); - check_isinfn ("real(casinh(-0 - i Inf)) = -Inf", __real__ result); - check ("imag(casinh(-0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(casinh) (BUILD_COMPLEX (0.1, plus_infty)); - check_isinfp ("real(casinh(0.1 + i Inf)) = +Inf", __real__ result); - check ("imag(casinh(0.1 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(casinh) (BUILD_COMPLEX (0.1, minus_infty)); - check_isinfp ("real(casinh(0.1 - i Inf)) = +Inf", __real__ result); - check ("imag(casinh(0.1 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - - result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, 0)); - check_isinfn ("real(casinh(-Inf + i0)) = -Inf", __real__ result); - check ("imag(casinh(-Inf + i0)) = 0", __imag__ result, 0); - result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, minus_zero)); - check_isinfn ("real(casinh(-Inf - i0)) = -Inf", __real__ result); - check ("imag(casinh(-Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, 100)); - check_isinfn ("real(casinh(-Inf + i100)) = -Inf", __real__ result); - check ("imag(casinh(-Inf + i100)) = 0", __imag__ result, 0); - result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, -100)); - check_isinfn ("real(casinh(-Inf - i100)) = -Inf", __real__ result); - check ("imag(casinh(-Inf - i100)) = -0", __imag__ result, minus_zero); - - result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, 0)); - check_isinfp ("real(casinh(+Inf + i0)) = +Inf", __real__ result); - check ("imag(casinh(+Inf + i0)) = 0", __imag__ result, 0); - result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isinfp ("real(casinh(+Inf - i0)) = +Inf", __real__ result); - check ("imag(casinh(+Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, 0.5)); - check_isinfp ("real(casinh(+Inf + i0.5)) = +Inf", __real__ result); - check ("imag(casinh(+Inf + i0.5)) = 0", __imag__ result, 0); - result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, -0.5)); - check_isinfp ("real(casinh(+Inf - i0.5)) = +Inf", __real__ result); - check ("imag(casinh(+Inf - i0.5)) = -0", __imag__ result, minus_zero); - - result = FUNC(casinh) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isinfp ("real(casinh(+Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(casinh(+Inf + i NaN)) = NaN", __imag__ result); - result = FUNC(casinh) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isinfn ("real(casinh(-Inf + i NaN)) = -Inf", __real__ result); - check_isnan ("imag(casinh(-Inf + i NaN)) = NaN", __imag__ result); - - result = FUNC(casinh) (BUILD_COMPLEX (nan_value, 0)); - check_isnan ("real(casinh(NaN + i0)) = NaN", __real__ result); - check ("imag(casinh(NaN + i0)) = 0", __imag__ result, 0); - result = FUNC(casinh) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan ("real(casinh(NaN - i0)) = NaN", __real__ result); - check ("imag(casinh(NaN - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(casinh) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isinfp ("real(casinh(NaN + i Inf)) = +-Inf", - FUNC(fabs) (__real__ result)); - check_isnan ("imag(casinh(NaN + i Inf)) = NaN", __imag__ result); - result = FUNC(casinh) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isinfp ("real(casinh(NaN - i Inf)) = +-Inf", - FUNC(fabs) (__real__ result)); - check_isnan ("imag(casinh(NaN - i Inf)) = NaN", __imag__ result); - - result = FUNC(casinh) (BUILD_COMPLEX (10.5, nan_value)); - check_isnan_maybe_exc ("real(casinh(10.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(casinh(10.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(casinh) (BUILD_COMPLEX (-10.5, nan_value)); - check_isnan_maybe_exc ("real(casinh(-10.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(casinh(-10.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(casinh) (BUILD_COMPLEX (nan_value, 0.75)); - check_isnan_maybe_exc ("real(casinh(NaN + i0.75)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(casinh(NaN + i0.75)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(casinh) (BUILD_COMPLEX (-0.75, nan_value)); - check_isnan_maybe_exc ("real(casinh(NaN - i0.75)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(casinh(NaN - i0.75)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(casinh) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(casinh(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(casinh(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(casinh) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(casinh(0.7 + i 1.2)) == 0.97865...", __real__ result, - 0.9786545955936738768L, CHOOSE (5e-17L, 2e-16, 0)); - check_eps ("imag(casinh(0.7 + i 1.2)) == 0.91135...", __imag__ result, - 0.9113541895315601156L, CHOOSE (7e-19L, 2e-16, 2e-7)); - - result = FUNC(casinh) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(casinh(-2 - i 3)) == -1.96863...", __real__ result, - -1.9686379257930962917L, CHOOSE (7e-19L, 2e-15, 3e-6)); - check_eps ("imag(casinh(-2 - i 3)) == -0.96465...", __imag__ result, - -0.9646585044076027920L, CHOOSE (4e-19L, 2e-15, 4.5e-7)); -} - - -static void -catan_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(catan) (BUILD_COMPLEX (0, 0)); - check ("real(catan(0 + i0)) = 0", __real__ result, 0); - check ("imag(catan(0 + i0)) = 0", __imag__ result, 0); - result = FUNC(catan) (BUILD_COMPLEX (minus_zero, 0)); - check ("real(catan(-0 + i0)) = -0", __real__ result, minus_zero); - check ("imag(catan(-0 + i0)) = 0", __imag__ result, 0); - result = FUNC(catan) (BUILD_COMPLEX (0, minus_zero)); - check ("real(catan(0 - i0)) = 0", __real__ result, 0); - check ("imag(catan(0 - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(catan) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(catan(-0 - i0)) = -0", __real__ result, minus_zero); - check ("imag(catan(-0 - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(catan) (BUILD_COMPLEX (plus_infty, plus_infty)); - check ("real(catan(+Inf + i Inf)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(+Inf + i Inf)) = 0", __imag__ result, 0); - result = FUNC(catan) (BUILD_COMPLEX (plus_infty, minus_infty)); - check ("real(catan(+Inf - i Inf)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(+Inf - i Inf)) = -0", __imag__ result, minus_zero); - result = FUNC(catan) (BUILD_COMPLEX (minus_infty, plus_infty)); - check ("real(catan(-Inf + i Inf)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-Inf + i Inf)) = 0", __imag__ result, 0.0); - result = FUNC(catan) (BUILD_COMPLEX (minus_infty, minus_infty)); - check ("real(catan(-Inf - i Inf)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-Inf - i Inf)) = -0", __imag__ result, minus_zero); - - result = FUNC(catan) (BUILD_COMPLEX (plus_infty, -10.0)); - check ("real(catan(+Inf - i10.0)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(+Inf - i10.0)) = -0", __imag__ result, minus_zero); - result = FUNC(catan) (BUILD_COMPLEX (minus_infty, -10.0)); - check ("real(catan(-Inf - i10.0)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-Inf - i10.0)) = -0", __imag__ result, minus_zero); - result = FUNC(catan) (BUILD_COMPLEX (plus_infty, minus_zero)); - check ("real(catan(Inf - i0)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(catan) (BUILD_COMPLEX (minus_infty, minus_zero)); - check ("real(catan(-Inf - i0)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(catan) (BUILD_COMPLEX (plus_infty, 0.0)); - check ("real(catan(Inf + i0)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(Inf + i0)) = 0", __imag__ result, 0.0); - result = FUNC(catan) (BUILD_COMPLEX (minus_infty, 0.0)); - check ("real(catan(-Inf + i0)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-Inf + i0)) = 0", __imag__ result, 0.0); - result = FUNC(catan) (BUILD_COMPLEX (plus_infty, 0.1)); - check ("real(catan(+Inf + i0.1)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(+Inf + i0.1)) = 0", __imag__ result, 0); - result = FUNC(catan) (BUILD_COMPLEX (minus_infty, 0.1)); - check ("real(catan(-Inf + i0.1)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-Inf + i0.1)) = 0", __imag__ result, 0); - - result = FUNC(catan) (BUILD_COMPLEX (0.0, minus_infty)); - check ("real(catan(0 - i Inf)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(0 - i Inf)) = -0", __imag__ result, minus_zero); - result = FUNC(catan) (BUILD_COMPLEX (minus_zero, minus_infty)); - check ("real(catan(-0 - i Inf)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-0 - i Inf)) = -0", __imag__ result, minus_zero); - result = FUNC(catan) (BUILD_COMPLEX (100.0, minus_infty)); - check ("real(catan(100 - i Inf)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(100 - i Inf)) = -0", __imag__ result, minus_zero); - result = FUNC(catan) (BUILD_COMPLEX (-100.0, minus_infty)); - check ("real(catan(-100 - i Inf)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-100 - i Inf)) = -0", __imag__ result, minus_zero); - - result = FUNC(catan) (BUILD_COMPLEX (0.0, plus_infty)); - check ("real(catan(0 + i Inf)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(0 + i Inf)) = 0", __imag__ result, 0); - result = FUNC(catan) (BUILD_COMPLEX (minus_zero, plus_infty)); - check ("real(catan(-0 + i Inf)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-0 + i Inf)) = 0", __imag__ result, 0); - result = FUNC(catan) (BUILD_COMPLEX (0.5, plus_infty)); - check ("real(catan(0.5 + i Inf)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(0.5 + i Inf)) = 0", __imag__ result, 0); - result = FUNC(catan) (BUILD_COMPLEX (-0.5, plus_infty)); - check ("real(catan(-0.5 + i Inf)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-0.5 + i Inf)) = 0", __imag__ result, 0); - - result = FUNC(catan) (BUILD_COMPLEX (nan_value, 0.0)); - check_isnan ("real(catan(NaN + i0)) = NaN", __real__ result); - check ("imag(catan(NaN + i0)) = 0", __imag__ result, 0.0); - result = FUNC(catan) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan ("real(catan(NaN - i0)) = NaN", __real__ result); - check ("imag(catan(NaN - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(catan) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isnan ("real(catan(NaN + i Inf)) = NaN", __real__ result); - check ("imag(catan(NaN + i Inf)) = 0", __imag__ result, 0); - result = FUNC(catan) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isnan ("real(catan(NaN - i Inf)) = NaN", __real__ result); - check ("imag(catan(NaN - i Inf)) = -0", __imag__ result, minus_zero); - - result = FUNC(catan) (BUILD_COMPLEX (0.0, nan_value)); - check_isnan ("real(catan(0 + i NaN)) = NaN", __real__ result); - check_isnan ("imag(catan(0 + i NaN)) = NaN", __imag__ result); - result = FUNC(catan) (BUILD_COMPLEX (minus_zero, nan_value)); - check_isnan ("real(catan(-0 + i NaN)) = NaN", __real__ result); - check_isnan ("imag(catan(-0 + i NaN)) = NaN", __imag__ result); - - result = FUNC(catan) (BUILD_COMPLEX (plus_infty, nan_value)); - check ("real(catan(+Inf + i NaN)) = pi/2", __real__ result, M_PI_2l); - check ("imag(catan(+Inf + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0); - result = FUNC(catan) (BUILD_COMPLEX (minus_infty, nan_value)); - check ("real(catan(-Inf + i NaN)) = -pi/2", __real__ result, -M_PI_2l); - check ("imag(catan(-Inf + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0); - - result = FUNC(catan) (BUILD_COMPLEX (nan_value, 10.5)); - check_isnan_maybe_exc ("real(catan(NaN + i10.5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(catan(NaN + i10.5)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(catan) (BUILD_COMPLEX (nan_value, -10.5)); - check_isnan_maybe_exc ("real(catan(NaN - i10.5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(catan(NaN - i10.5)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(catan) (BUILD_COMPLEX (0.75, nan_value)); - check_isnan_maybe_exc ("real(catan(0.75 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(catan(0.75 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(catan) (BUILD_COMPLEX (-0.75, nan_value)); - check_isnan_maybe_exc ("real(catan(-0.75 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(catan(-0.75 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(catan) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(catan(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(catan(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(catan) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(catan(0.7 + i 1.2)) == 1.07857...", __real__ result, - 1.0785743834118921877L, CHOOSE (3e-17, 0, 5e-7)); - check_eps ("imag(catan(0.7 + i 1.2)) == 0.57705...", __imag__ result, - 0.5770573776534306764L, CHOOSE (3e-17L, 2e-16, 6e-8)); - - result = FUNC(catan) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(catan(-2 - i 3)) == -1.40992...", __real__ result, - -1.4099210495965755225L, CHOOSE (0, 0, 4e-7)); - check_eps ("imag(catan(-2 - i 3)) == -0.22907...", __imag__ result, - -0.2290726829685387662L, CHOOSE (1.1e-19L, 3e-17, 2e-8)); -} - - -static void -catanh_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(catanh) (BUILD_COMPLEX (0, 0)); - check ("real(catanh(0 + i0)) = 0", __real__ result, 0); - check ("imag(catanh(0 + i0)) = 0", __imag__ result, 0); - result = FUNC(catanh) (BUILD_COMPLEX (minus_zero, 0)); - check ("real(catanh(-0 + i0)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-0 + i0)) = 0", __imag__ result, 0); - result = FUNC(catanh) (BUILD_COMPLEX (0, minus_zero)); - check ("real(catanh(0 - i0)) = 0", __real__ result, 0); - check ("imag(catanh(0 - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(catanh) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(catanh(-0 - i0)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-0 - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, plus_infty)); - check ("real(catanh(+Inf + i Inf)) = 0", __real__ result, 0); - check ("imag(catanh(+Inf + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, minus_infty)); - check ("real(catanh(+Inf - i Inf)) = 0", __real__ result, 0); - check ("imag(catanh(+Inf - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, plus_infty)); - check ("real(catanh(-Inf + i Inf)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-Inf + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, minus_infty)); - check ("real(catanh(-Inf - i Inf)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-Inf - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - - result = FUNC(catanh) (BUILD_COMPLEX (-10.0, plus_infty)); - check ("real(catanh(-10.0 + i Inf)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-10.0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (-10.0, minus_infty)); - check ("real(catanh(-10.0 - i Inf)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-10.0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (minus_zero, plus_infty)); - check ("real(catanh(-0 + i Inf)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (minus_zero, minus_infty)); - check ("real(catanh(-0 - i Inf)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (0, plus_infty)); - check ("real(catanh(0 + i Inf)) = 0", __real__ result, 0); - check ("imag(catanh(0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (0, minus_infty)); - check ("real(catanh(0 - i Inf)) = 0", __real__ result, 0); - check ("imag(catanh(0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (0.1, plus_infty)); - check ("real(catanh(0.1 + i Inf)) = 0", __real__ result, 0); - check ("imag(catanh(0.1 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (0.1, minus_infty)); - check ("real(catanh(0.1 - i Inf)) = 0", __real__ result, 0); - check ("imag(catanh(0.1 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - - result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, 0)); - check ("real(catanh(-Inf + i0)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-Inf + i0)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, minus_zero)); - check ("real(catanh(-Inf - i0)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-Inf - i0)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, 100)); - check ("real(catanh(-Inf + i100)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-Inf + i100)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, -100)); - check ("real(catanh(-Inf - i100)) = -0", __real__ result, minus_zero); - check ("imag(catanh(-Inf - i100)) = -pi/2", __imag__ result, -M_PI_2l); - - result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, 0)); - check ("real(catanh(+Inf + i0)) = 0", __real__ result, 0); - check ("imag(catanh(+Inf + i0)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, minus_zero)); - check ("real(catanh(+Inf - i0)) = 0", __real__ result, 0); - check ("imag(catanh(+Inf - i0)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, 0.5)); - check ("real(catanh(+Inf + i0.5)) = 0", __real__ result, 0); - check ("imag(catanh(+Inf + i0.5)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, -0.5)); - check ("real(catanh(+Inf - i0.5)) = 0", __real__ result, 0); - check ("imag(catanh(+Inf - i0.5)) = -pi/2", __imag__ result, -M_PI_2l); - - result = FUNC(catanh) (BUILD_COMPLEX (0, nan_value)); - check ("real(catanh(0 + i NaN)) = 0", __real__ result, 0); - check_isnan ("imag(catanh(0 + i NaN)) = NaN", __imag__ result); - result = FUNC(catanh) (BUILD_COMPLEX (minus_zero, nan_value)); - check ("real(catanh(-0 + i NaN)) = -0", __real__ result, minus_zero); - check_isnan ("imag(catanh(-0 + i NaN)) = NaN", __imag__ result); - - result = FUNC(catanh) (BUILD_COMPLEX (plus_infty, nan_value)); - check ("real(catanh(+Inf + i NaN)) = 0", __real__ result, 0); - check_isnan ("imag(catanh(+Inf + i NaN)) = NaN", __imag__ result); - result = FUNC(catanh) (BUILD_COMPLEX (minus_infty, nan_value)); - check ("real(catanh(-Inf + i NaN)) = -0", __real__ result, minus_zero); - check_isnan ("imag(catanh(-Inf + i NaN)) = NaN", __imag__ result); - - result = FUNC(catanh) (BUILD_COMPLEX (nan_value, 0)); - check_isnan ("real(catanh(NaN + i0)) = NaN", __real__ result); - check_isnan ("imag(catanh(NaN + i0)) = NaN", __imag__ result); - result = FUNC(catanh) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan ("real(catanh(NaN - i0)) = NaN", __real__ result); - check_isnan ("imag(catanh(NaN - i0)) = NaN", __imag__ result); - - result = FUNC(catanh) (BUILD_COMPLEX (nan_value, plus_infty)); - check ("real(catanh(NaN + i Inf)) = +-0", FUNC(fabs) (__real__ result), 0); - check ("imag(catanh(NaN + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(catanh) (BUILD_COMPLEX (nan_value, minus_infty)); - check ("real(catanh(NaN - i Inf)) = +-0", FUNC(fabs) (__real__ result), 0); - check ("imag(catanh(NaN - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - - result = FUNC(catanh) (BUILD_COMPLEX (10.5, nan_value)); - check_isnan_maybe_exc ("real(catanh(10.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(catanh(10.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(catanh) (BUILD_COMPLEX (-10.5, nan_value)); - check_isnan_maybe_exc ("real(catanh(-10.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(catanh(-10.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(catanh) (BUILD_COMPLEX (nan_value, 0.75)); - check_isnan_maybe_exc ("real(catanh(NaN + i0.75)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(catanh(NaN + i0.75)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(catanh) (BUILD_COMPLEX (nan_value, -0.75)); - check_isnan_maybe_exc ("real(catanh(NaN - i0.75)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(catanh(NaN - i0.75)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(catanh) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(catanh(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(catanh(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(catanh) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(catanh(0.7 + i 1.2)) == 0.26007...", __real__ result, - 0.2600749516525135959L, CHOOSE (2e-18, 6e-17, 3e-8)); - check_eps ("imag(catanh(0.7 + i 1.2)) == 0.97024...", __imag__ result, - 0.9702403077950989849L, CHOOSE (3e-17, 2e-16, 4e-7)); - - result = FUNC(catanh) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(catanh(-2 - i 3)) == -0.14694...", __real__ result, - -0.1469466662255297520L, CHOOSE (9e-20L, 2e-16, 2e-8)); - check_eps ("imag(catanh(-2 - i 3)) == -1.33897...", __imag__ result, - -1.3389725222944935611L, CHOOSE (7e-19L, 0, 5e-7)); -} - - -static void -ctan_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(ctan) (BUILD_COMPLEX (0, 0)); - check ("real(ctan(0 + i0)) = 0", __real__ result, 0); - check ("imag(ctan(0 + i0)) = 0", __imag__ result, 0); - result = FUNC(ctan) (BUILD_COMPLEX (0, minus_zero)); - check ("real(ctan(0 - i0)) = 0", __real__ result, 0); - check ("imag(ctan(0 - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(ctan) (BUILD_COMPLEX (minus_zero, 0)); - check ("real(ctan(-0 + i0)) = -0", __real__ result, minus_zero); - check ("imag(ctan(-0 + i0)) = 0", __imag__ result, 0); - result = FUNC(ctan) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(ctan(-0 - i0)) = -0", __real__ result, minus_zero); - check ("imag(ctan(-0 - i0)) = -0", __imag__ result, minus_zero); - - - result = FUNC(ctan) (BUILD_COMPLEX (0, plus_infty)); - check ("real(ctan(0 + i Inf)) = 0", __real__ result, 0); - check ("imag(ctan(0 + i Inf)) = 1", __imag__ result, 1); - result = FUNC(ctan) (BUILD_COMPLEX (1, plus_infty)); - check ("real(ctan(1 + i Inf)) = 0", __real__ result, 0); - check ("imag(ctan(1 + i Inf)) = 1", __imag__ result, 1); - result = FUNC(ctan) (BUILD_COMPLEX (minus_zero, plus_infty)); - check ("real(ctan(-0 + i Inf)) = -0", __real__ result, minus_zero); - check ("imag(ctan(-0 + i Inf)) = 1", __imag__ result, 1); - result = FUNC(ctan) (BUILD_COMPLEX (-1, plus_infty)); - check ("real(ctan(-1 + i Inf)) = -0", __real__ result, minus_zero); - check ("imag(ctan(-1 + i Inf)) = 1", __imag__ result, 1); - - result = FUNC(ctan) (BUILD_COMPLEX (0, minus_infty)); - check ("real(ctan(0 - i Inf)) = 0", __real__ result, 0); - check ("imag(ctan(0 - i Inf)) = -1", __imag__ result, -1); - result = FUNC(ctan) (BUILD_COMPLEX (1, minus_infty)); - check ("real(ctan(1 - i Inf)) = 0", __real__ result, 0); - check ("imag(ctan(1 - i Inf)) = -1", __imag__ result, -1); - result = FUNC(ctan) (BUILD_COMPLEX (minus_zero, minus_infty)); - check ("real(ctan(-0 - i Inf)) = -0", __real__ result, minus_zero); - check ("imag(ctan(-0 - i Inf)) = -1", __imag__ result, -1); - result = FUNC(ctan) (BUILD_COMPLEX (-1, minus_infty)); - check ("real(ctan(-1 - i Inf)) = -0", __real__ result, minus_zero); - check ("imag(ctan(-1 - i Inf)) = -1", __imag__ result, -1); - - result = FUNC(ctan) (BUILD_COMPLEX (plus_infty, 0)); - check_isnan_exc ("real(ctan(Inf + i 0)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(Inf + i 0)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (plus_infty, 2)); - check_isnan_exc ("real(ctan(Inf + i 2)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(Inf + i 2)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (minus_infty, 0)); - check_isnan_exc ("real(ctan(-Inf + i 0)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(-Inf + i 0)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (minus_infty, 2)); - check_isnan_exc ("real(ctan(- Inf + i 2)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(- Inf + i 2)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isnan_exc ("real(ctan(Inf - i 0)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(Inf - i 0)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (plus_infty, -2)); - check_isnan_exc ("real(ctan(Inf - i 2)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(Inf - i 2)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (minus_infty, minus_zero)); - check_isnan_exc ("real(ctan(-Inf - i 0)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(-Inf - i 0)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (minus_infty, -2)); - check_isnan_exc ("real(ctan(-Inf - i 2)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(-Inf - i 2)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(ctan) (BUILD_COMPLEX (nan_value, plus_infty)); - check ("real(ctan(NaN + i Inf)) = +-0", FUNC(fabs) (__real__ result), 0); - check ("imag(ctan(NaN + i Inf)) = 1", __imag__ result, 1); - result = FUNC(ctan) (BUILD_COMPLEX (nan_value, minus_infty)); - check ("real(ctan(NaN - i Inf)) = +-0", FUNC(fabs) (__real__ result), 0); - check ("imag(ctan(NaN - i Inf)) = -1", __imag__ result, -1); - - result = FUNC(ctan) (BUILD_COMPLEX (0, nan_value)); - check ("real(ctan(0 + i NaN)) = 0", __real__ result, 0); - check_isnan ("imag(ctan(0 + i NaN)) = NaN", __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (minus_zero, nan_value)); - check ("real(ctan(-0 + i NaN)) = -0", __real__ result, minus_zero); - check_isnan ("imag(ctan(-0 + i NaN)) = NaN", __imag__ result); - - result = FUNC(ctan) (BUILD_COMPLEX (0.5, nan_value)); - check_isnan_maybe_exc ("real(ctan(0.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(0.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (-4.5, nan_value)); - check_isnan_maybe_exc ("real(ctan(-4.5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(-4.5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ctan) (BUILD_COMPLEX (nan_value, 0)); - check_isnan_maybe_exc ("real(ctan(NaN + i 0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(NaN + i 0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (nan_value, 5)); - check_isnan_maybe_exc ("real(ctan(NaN + i 5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(NaN + i 5)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan_maybe_exc ("real(ctan(NaN - i 0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(NaN - i 0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ctan) (BUILD_COMPLEX (nan_value, -0.25)); - check_isnan_maybe_exc ("real(ctan(NaN -i 0.25)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctan(NaN -i 0.25)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ctan) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(ctan(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(ctan(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(ctan) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(ctan(0.7 + i 1.2)) == 0.17207...", __real__ result, - 0.1720734197630349001L, CHOOSE (1e-17L, 5.6e-17, 2e-8)); - check_eps ("imag(ctan(0.7 + i 1.2)) == 0.95448...", __imag__ result, - 0.9544807059989405538L, CHOOSE (2e-17L, 2.3e-16, 6e-8)); - - result = FUNC(ctan) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(ctan(-2 - i 3)) == -0.00376...", __real__ result, - 0.0037640256415042482L, CHOOSE (1e-19L, 5e-19, 0)); - check_eps ("imag(ctan(-2 - i 3)) == -1.00323...", __imag__ result, - -1.0032386273536098014L, CHOOSE (2e-19L, 2.3e-16, 2e-7)); -} - - -static void -ctanh_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(ctanh) (BUILD_COMPLEX (0, 0)); - check ("real(ctanh(0 + i0)) = 0", __real__ result, 0); - check ("imag(ctanh(0 + i0)) = 0", __imag__ result, 0); - result = FUNC(ctanh) (BUILD_COMPLEX (0, minus_zero)); - check ("real(ctanh(0 - i0)) = 0", __real__ result, 0); - check ("imag(ctanh(0 - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_zero, 0)); - check ("real(ctanh(-0 + i0)) = -0", __real__ result, minus_zero); - check ("imag(ctanh(-0 + i0)) = 0", __imag__ result, 0); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(ctanh(-0 - i0)) = -0", __real__ result, minus_zero); - check ("imag(ctanh(-0 - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(ctanh) (BUILD_COMPLEX (plus_infty, 0)); - check ("real(ctanh(+Inf + i0)) = 1", __real__ result, 1); - check ("imag(ctanh(+Inf + i0)) = 0", __imag__ result, 0); - result = FUNC(ctanh) (BUILD_COMPLEX (plus_infty, 1)); - check ("real(ctanh(+Inf + i1)) = 1", __real__ result, 1); - check ("imag(ctanh(+Inf + i1)) = 0", __imag__ result, 0); - result = FUNC(ctanh) (BUILD_COMPLEX (plus_infty, minus_zero)); - check ("real(ctanh(+Inf - i0)) = 1", __real__ result, 1); - check ("imag(ctanh(+Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(ctanh) (BUILD_COMPLEX (plus_infty, -1)); - check ("real(ctanh(+Inf - i1)) = 1", __real__ result, 1); - check ("imag(ctanh(+Inf - i1)) = -0", __imag__ result, minus_zero); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_infty, 0)); - check ("real(ctanh(-Inf + i0)) = -1", __real__ result, -1); - check ("imag(ctanh(-Inf + i0)) = 0", __imag__ result, 0); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_infty, 1)); - check ("real(ctanh(-Inf + i1)) = -1", __real__ result, -1); - check ("imag(ctanh(-Inf + i1)) = 0", __imag__ result, 0); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_infty, minus_zero)); - check ("real(ctanh(-Inf - i0)) = -1", __real__ result, -1); - check ("imag(ctanh(-Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_infty, -1)); - check ("real(ctanh(-Inf - i1)) = -1", __real__ result, -1); - check ("imag(ctanh(-Inf - i1)) = -0", __imag__ result, minus_zero); - - result = FUNC(ctanh) (BUILD_COMPLEX (0, plus_infty)); - check_isnan_exc ("real(ctanh(0 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(0 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (2, plus_infty)); - check_isnan_exc ("real(ctanh(2 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(2 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (0, minus_infty)); - check_isnan_exc ("real(ctanh(0 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(0 - i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (2, minus_infty)); - check_isnan_exc ("real(ctanh(2 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(2 - i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_zero, plus_infty)); - check_isnan_exc ("real(ctanh(-0 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(-0 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (-2, plus_infty)); - check_isnan_exc ("real(ctanh(-2 + i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(-2 + i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_zero, minus_infty)); - check_isnan_exc ("real(ctanh(-0 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(-0 - i Inf)) = NaN plus invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (-2, minus_infty)); - check_isnan_exc ("real(ctanh(-2 - i Inf)) = NaN plus invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(-2 - i Inf)) = NaN plus invalid exception", - __imag__ result); - - result = FUNC(ctanh) (BUILD_COMPLEX (plus_infty, nan_value)); - check ("real(ctanh(+Inf + i NaN)) = 1", __real__ result, 1); - check ("imag(ctanh(+Inf + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_infty, nan_value)); - check ("real(ctanh(-Inf + i NaN)) = -1", __real__ result, -1); - check ("imag(ctanh(-Inf + i NaN)) = +-0", FUNC(fabs) (__imag__ result), 0); - - result = FUNC(ctanh) (BUILD_COMPLEX (nan_value, 0)); - check_isnan ("real(ctanh(NaN + i0)) = NaN", __real__ result); - check ("imag(ctanh(NaN + i0)) = 0", __imag__ result, 0); - result = FUNC(ctanh) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan ("real(ctanh(NaN - i0)) = NaN", __real__ result); - check ("imag(ctanh(NaN - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(ctanh) (BUILD_COMPLEX (nan_value, 0.5)); - check_isnan_maybe_exc ("real(ctanh(NaN + i0.5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(NaN + i0.5)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (nan_value, -4.5)); - check_isnan_maybe_exc ("real(ctanh(NaN - i4.5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(NaN - i4.5)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ctanh) (BUILD_COMPLEX (0, nan_value)); - check_isnan_maybe_exc ("real(ctanh(0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (5, nan_value)); - check_isnan_maybe_exc ("real(ctanh(5 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(5 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (minus_zero, nan_value)); - check_isnan_maybe_exc ("real(ctanh(-0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(-0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(ctanh) (BUILD_COMPLEX (-0.25, nan_value)); - check_isnan_maybe_exc ("real(ctanh(-0.25 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(ctanh(-0.25 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(ctanh) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(ctanh(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(ctanh(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(ctanh) (BUILD_COMPLEX (0, M_PI_4l)); - check ("real(ctanh (0 + i pi/4)) == 0", __real__ result, 0); - check_eps ("imag(ctanh (0 + i pi/4)) == 1", __imag__ result, 1, - CHOOSE (0, 2e-16, 2e-7)); - - result = FUNC(ctanh) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(ctanh(0.7 + i 1.2)) == 1.34721...", __real__ result, - 1.3472197399061191630L, CHOOSE (4e-17L, 6.7e-16, 2e-7)); - check_eps ("imag(ctanh(0.7 + i 1.2)) == -0.47786...", __imag__ result, - 0.4778641038326365540L, CHOOSE (9e-17L, 2.8e-16, 9e-8)); - - result = FUNC(ctanh) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(ctanh(-2 - i 3)) == -0.96538...", __real__ result, - -0.9653858790221331242L, CHOOSE (2e-19L, 2e-16, 2e-7)); - check_eps ("imag(ctanh(-2 - i 3)) == 0.00988...", __imag__ result, - 0.0098843750383224937L, CHOOSE (7e-20L, 2e-16, 1e-9)); -} - - -static void -clog_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(clog) (BUILD_COMPLEX (minus_zero, 0)); - check_isinfn_exc ("real(clog(-0 + i0)) = -Inf plus divide-by-zero exception", - __real__ result, DIVIDE_BY_ZERO_EXCEPTION); - check ("imag(clog(-0 + i0)) = pi plus divide-by-zero exception", - __imag__ result, M_PIl); - result = FUNC(clog) (BUILD_COMPLEX (minus_zero, minus_zero)); - check_isinfn_exc ("real(clog(-0 - i0)) = -Inf plus divide-by-zero exception", - __real__ result, DIVIDE_BY_ZERO_EXCEPTION); - check ("imag(clog(-0 - i0)) = -pi plus divide-by-zero exception", - __imag__ result, -M_PIl); - - result = FUNC(clog) (BUILD_COMPLEX (0, 0)); - check_isinfn_exc ("real(clog(0 + i0)) = -Inf plus divide-by-zero exception", - __real__ result, DIVIDE_BY_ZERO_EXCEPTION); - check ("imag(clog(0 + i0)) = 0 plus divide-by-zero exception", - __imag__ result, 0); - result = FUNC(clog) (BUILD_COMPLEX (0, minus_zero)); - check_isinfn_exc ("real(clog(0 - i0)) = -Inf plus divide-by-zero exception", - __real__ result, DIVIDE_BY_ZERO_EXCEPTION); - check ("imag(clog(0 - i0)) = -0 plus divide-by-zero exception", - __imag__ result, minus_zero); - - result = FUNC(clog) (BUILD_COMPLEX (minus_infty, plus_infty)); - check_isinfp ("real(clog(-Inf + i Inf)) = +Inf", __real__ result); - check ("imag(clog(-Inf + i Inf)) = 3*pi/4", __imag__ result, - M_PIl - M_PI_4l); - result = FUNC(clog) (BUILD_COMPLEX (minus_infty, minus_infty)); - check_isinfp ("real(clog(-Inf - i Inf)) = +Inf", __real__ result); - check ("imag(clog(-Inf - i Inf)) = -3*pi/4", __imag__ result, - M_PI_4l - M_PIl); - - result = FUNC(clog) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isinfp ("real(clog(+Inf + i Inf)) = +Inf", __real__ result); - check ("imag(clog(+Inf + i Inf)) = pi/4", __imag__ result, M_PI_4l); - result = FUNC(clog) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isinfp ("real(clog(+Inf - i Inf)) = +Inf", __real__ result); - check ("imag(clog(+Inf - i Inf)) = -pi/4", __imag__ result, -M_PI_4l); - - result = FUNC(clog) (BUILD_COMPLEX (0, plus_infty)); - check_isinfp ("real(clog(0 + i Inf)) = +Inf", __real__ result); - check ("imag(clog(0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(clog) (BUILD_COMPLEX (3, plus_infty)); - check_isinfp ("real(clog(3 + i Inf)) = +Inf", __real__ result); - check ("imag(clog(3 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(clog) (BUILD_COMPLEX (minus_zero, plus_infty)); - check_isinfp ("real(clog(-0 + i Inf)) = +Inf", __real__ result); - check ("imag(clog(-0 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(clog) (BUILD_COMPLEX (-3, plus_infty)); - check_isinfp ("real(clog(-3 + i Inf)) = +Inf", __real__ result); - check ("imag(clog(-3 + i Inf)) = pi/2", __imag__ result, M_PI_2l); - result = FUNC(clog) (BUILD_COMPLEX (0, minus_infty)); - check_isinfp ("real(clog(0 - i Inf)) = +Inf", __real__ result); - check ("imag(clog(0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(clog) (BUILD_COMPLEX (3, minus_infty)); - check_isinfp ("real(clog(3 - i Inf)) = +Inf", __real__ result); - check ("imag(clog(3 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(clog) (BUILD_COMPLEX (minus_zero, minus_infty)); - check_isinfp ("real(clog(-0 - i Inf)) = +Inf", __real__ result); - check ("imag(clog(-0 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - result = FUNC(clog) (BUILD_COMPLEX (-3, minus_infty)); - check_isinfp ("real(clog(-3 - i Inf)) = +Inf", __real__ result); - check ("imag(clog(-3 - i Inf)) = -pi/2", __imag__ result, -M_PI_2l); - - result = FUNC(clog) (BUILD_COMPLEX (minus_infty, 0)); - check_isinfp ("real(clog(-Inf + i0)) = +Inf", __real__ result); - check ("imag(clog(-Inf + i0)) = pi", __imag__ result, M_PIl); - result = FUNC(clog) (BUILD_COMPLEX (minus_infty, 1)); - check_isinfp ("real(clog(-Inf + i1)) = +Inf", __real__ result); - check ("imag(clog(-Inf + i1)) = pi", __imag__ result, M_PIl); - result = FUNC(clog) (BUILD_COMPLEX (minus_infty, minus_zero)); - check_isinfp ("real(clog(-Inf - i0)) = +Inf", __real__ result); - check ("imag(clog(-Inf - i0)) = -pi", __imag__ result, -M_PIl); - result = FUNC(clog) (BUILD_COMPLEX (minus_infty, -1)); - check_isinfp ("real(clog(-Inf - i1)) = +Inf", __real__ result); - check ("imag(clog(-Inf - i1)) = -pi", __imag__ result, -M_PIl); - - result = FUNC(clog) (BUILD_COMPLEX (plus_infty, 0)); - check_isinfp ("real(clog(+Inf + i0)) = +Inf", __real__ result); - check ("imag(clog(+Inf + i0)) = 0", __imag__ result, 0); - result = FUNC(clog) (BUILD_COMPLEX (plus_infty, 1)); - check_isinfp ("real(clog(+Inf + i1)) = +Inf", __real__ result); - check ("imag(clog(+Inf + i1)) = 0", __imag__ result, 0); - result = FUNC(clog) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isinfp ("real(clog(+Inf - i0)) = +Inf", __real__ result); - check ("imag(clog(+Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(clog) (BUILD_COMPLEX (plus_infty, -1)); - check_isinfp ("real(clog(+Inf - i1)) = +Inf", __real__ result); - check ("imag(clog(+Inf - i1)) = -0", __imag__ result, minus_zero); - - result = FUNC(clog) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isinfp ("real(clog(+Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(clog(+Inf + i NaN)) = NaN", __imag__ result); - result = FUNC(clog) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isinfp ("real(clog(-Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(clog(-Inf + i NaN)) = NaN", __imag__ result); - - result = FUNC(clog) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isinfp ("real(clog(NaN + i Inf)) = +Inf", __real__ result); - check_isnan ("imag(clog(NaN + i Inf)) = NaN", __imag__ result); - result = FUNC(clog) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isinfp ("real(clog(NaN - i Inf)) = +Inf", __real__ result); - check_isnan ("imag(clog(NaN - i Inf)) = NaN", __imag__ result); - - result = FUNC(clog) (BUILD_COMPLEX (0, nan_value)); - check_isnan_maybe_exc ("real(clog(0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog(0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog) (BUILD_COMPLEX (3, nan_value)); - check_isnan_maybe_exc ("real(clog(3 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog(3 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog) (BUILD_COMPLEX (minus_zero, nan_value)); - check_isnan_maybe_exc ("real(clog(-0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog(-0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog) (BUILD_COMPLEX (-3, nan_value)); - check_isnan_maybe_exc ("real(clog(-3 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog(-3 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(clog) (BUILD_COMPLEX (nan_value, 0)); - check_isnan_maybe_exc ("real(clog(NaN + i0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog(NaN + i0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog) (BUILD_COMPLEX (nan_value, 5)); - check_isnan_maybe_exc ("real(clog(NaN + i5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog(NaN + i5)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan_maybe_exc ("real(clog(NaN - i0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog(NaN - i0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog) (BUILD_COMPLEX (nan_value, -5)); - check_isnan_maybe_exc ("real(clog(NaN - i5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog(NaN - i5)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(clog) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(clog(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(clog(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(clog) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(clog(0.7 + i 1.2)) == 0.32876...", __real__ result, - 0.3287600014583970919L, CHOOSE (5e-17L, 6e-17, 3e-8)); - check_eps ("imag(clog(0.7 + i 1.2)) == 1.04272...", __imag__ result, - 1.0427218783685369524L, CHOOSE (2e-17L, 2.5e-16, 1.2e-7)); - - result = FUNC(clog) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(clog(-2 - i 3)) == 1.28247...", __real__ result, - 1.2824746787307683680L, CHOOSE (3e-19L, 0, 0)); - check_eps ("imag(clog(-2 - i 3)) == -2.15879...", __imag__ result, - -2.1587989303424641704L, CHOOSE (2e-18L, 5e-16, 8e-7)); -} - - -static void -clog10_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(clog10) (BUILD_COMPLEX (minus_zero, 0)); - check_isinfn_exc ("real(clog10(-0 + i0)) = -Inf plus divide-by-zero exception", - __real__ result, DIVIDE_BY_ZERO_EXCEPTION); - check ("imag(clog10(-0 + i0)) = pi plus divide-by-zero exception", - __imag__ result, M_PIl); - result = FUNC(clog10) (BUILD_COMPLEX (minus_zero, minus_zero)); - check_isinfn_exc ("real(clog10(-0 - i0)) = -Inf plus divide-by-zero exception", - __real__ result, DIVIDE_BY_ZERO_EXCEPTION); - check ("imag(clog10(-0 - i0)) = -pi plus divide-by-zero exception", - __imag__ result, -M_PIl); - - result = FUNC(clog10) (BUILD_COMPLEX (0, 0)); - check_isinfn_exc ("real(clog10(0 + i0)) = -Inf plus divide-by-zero exception", - __real__ result, DIVIDE_BY_ZERO_EXCEPTION); - check ("imag(clog10(0 + i0)) = 0 plus divide-by-zero exception", - __imag__ result, 0); - result = FUNC(clog10) (BUILD_COMPLEX (0, minus_zero)); - check_isinfn_exc ("real(clog10(0 - i0)) = -Inf plus divide-by-zero exception", - __real__ result, DIVIDE_BY_ZERO_EXCEPTION); - check ("imag(clog10(0 - i0)) = -0 plus divide-by-zero exception", - __imag__ result, minus_zero); - - result = FUNC(clog10) (BUILD_COMPLEX (minus_infty, plus_infty)); - check_isinfp ("real(clog10(-Inf + i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(-Inf + i Inf)) = 3*pi/4*M_LOG10E", __imag__ result, - (M_PIl - M_PI_4l) * M_LOG10El, CHOOSE (0, 3e-16, 0)); - result = FUNC(clog10) (BUILD_COMPLEX (minus_infty, minus_infty)); - check_isinfp ("real(clog10(-Inf - i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(-Inf - i Inf)) = -3*pi/4*M_LOG10E", __imag__ result, - (M_PI_4l - M_PIl) * M_LOG10El, CHOOSE (0, 3e-16, 0)); - - result = FUNC(clog10) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isinfp ("real(clog10(+Inf + i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(+Inf + i Inf)) = pi/4*M_LOG10E", __imag__ result, - M_PI_4l * M_LOG10El, CHOOSE (0, 6e-17, 3e-8)); - result = FUNC(clog10) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isinfp ("real(clog10(+Inf - i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(+Inf - i Inf)) = -pi/4*M_LOG10E", __imag__ result, - -M_PI_4l * M_LOG10El, CHOOSE (0, 6e-17, 3e-8)); - - result = FUNC(clog10) (BUILD_COMPLEX (0, plus_infty)); - check_isinfp ("real(clog10(0 + i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(0 + i Inf)) = pi/2*M_LOG10E", __imag__ result, - M_PI_2l * M_LOG10El, CHOOSE (0, 2e-16, 6e-8)); - result = FUNC(clog10) (BUILD_COMPLEX (3, plus_infty)); - check_isinfp ("real(clog10(3 + i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(3 + i Inf)) = pi/2*M_LOG10E", __imag__ result, - M_PI_2l * M_LOG10El, CHOOSE (0, 2e-16, 6e-8)); - result = FUNC(clog10) (BUILD_COMPLEX (minus_zero, plus_infty)); - check_isinfp ("real(clog10(-0 + i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(-0 + i Inf)) = pi/2*M_LOG10E", __imag__ result, - M_PI_2l * M_LOG10El, CHOOSE (0, 2e-16, 6e-8)); - result = FUNC(clog10) (BUILD_COMPLEX (-3, plus_infty)); - check_isinfp ("real(clog10(-3 + i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(-3 + i Inf)) = pi/2*M_LOG10E", __imag__ result, - M_PI_2l * M_LOG10El, CHOOSE (0, 2e-16, 6e-8)); - result = FUNC(clog10) (BUILD_COMPLEX (0, minus_infty)); - check_isinfp ("real(clog10(0 - i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(0 - i Inf)) = -pi/2*M_LOG10E", __imag__ result, - -M_PI_2l * M_LOG10El, CHOOSE (0, 2e-16, 6e-8)); - result = FUNC(clog10) (BUILD_COMPLEX (3, minus_infty)); - check_isinfp ("real(clog10(3 - i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(3 - i Inf)) = -pi/2*M_LOG10E", __imag__ result, - -M_PI_2l * M_LOG10El, CHOOSE (0, 2e-16, 6e-8)); - result = FUNC(clog10) (BUILD_COMPLEX (minus_zero, minus_infty)); - check_isinfp ("real(clog10(-0 - i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(-0 - i Inf)) = -pi/2*M_LOG10E", __imag__ result, - -M_PI_2l * M_LOG10El, CHOOSE (0, 2e-16, 6e-8)); - result = FUNC(clog10) (BUILD_COMPLEX (-3, minus_infty)); - check_isinfp ("real(clog10(-3 - i Inf)) = +Inf", __real__ result); - check_eps ("imag(clog10(-3 - i Inf)) = -pi/2*M_LOG10E", __imag__ result, - -M_PI_2l * M_LOG10El, CHOOSE (0, 2e-16, 6e-8)); - - result = FUNC(clog10) (BUILD_COMPLEX (minus_infty, 0)); - check_isinfp ("real(clog10(-Inf + i0)) = +Inf", __real__ result); - check_eps ("imag(clog10(-Inf + i0)) = pi*M_LOG10E", __imag__ result, - M_PIl * M_LOG10El, CHOOSE (0, 3e-16, 2e-7)); - result = FUNC(clog10) (BUILD_COMPLEX (minus_infty, 1)); - check_isinfp ("real(clog10(-Inf + i1)) = +Inf", __real__ result); - check_eps ("imag(clog10(-Inf + i1)) = pi*M_LOG10E", __imag__ result, - M_PIl * M_LOG10El, CHOOSE (0, 3e-16, 2e-7)); - result = FUNC(clog10) (BUILD_COMPLEX (minus_infty, minus_zero)); - check_isinfp ("real(clog10(-Inf - i0)) = +Inf", __real__ result); - check_eps ("imag(clog10(-Inf - i0)) = -pi*M_LOG10E", __imag__ result, - -M_PIl * M_LOG10El, CHOOSE (0, 3e-16, 2e-7)); - result = FUNC(clog10) (BUILD_COMPLEX (minus_infty, -1)); - check_isinfp ("real(clog10(-Inf - i1)) = +Inf", __real__ result); - check_eps ("imag(clog10(-Inf - i1)) = -pi*M_LOG10E", __imag__ result, - -M_PIl * M_LOG10El, CHOOSE (0, 3e-16, 2e-7)); - - result = FUNC(clog10) (BUILD_COMPLEX (plus_infty, 0)); - check_isinfp ("real(clog10(+Inf + i0)) = +Inf", __real__ result); - check ("imag(clog10(+Inf + i0)) = 0", __imag__ result, 0); - result = FUNC(clog10) (BUILD_COMPLEX (plus_infty, 1)); - check_isinfp ("real(clog10(+Inf + i1)) = +Inf", __real__ result); - check ("imag(clog10(+Inf + i1)) = 0", __imag__ result, 0); - result = FUNC(clog10) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isinfp ("real(clog10(+Inf - i0)) = +Inf", __real__ result); - check ("imag(clog10(+Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(clog10) (BUILD_COMPLEX (plus_infty, -1)); - check_isinfp ("real(clog10(+Inf - i1)) = +Inf", __real__ result); - check ("imag(clog10(+Inf - i1)) = -0", __imag__ result, minus_zero); - - result = FUNC(clog10) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isinfp ("real(clog10(+Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(clog10(+Inf + i NaN)) = NaN", __imag__ result); - result = FUNC(clog10) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isinfp ("real(clog10(-Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(clog10(-Inf + i NaN)) = NaN", __imag__ result); - - result = FUNC(clog10) (BUILD_COMPLEX (nan_value, plus_infty)); - check_isinfp ("real(clog10(NaN + i Inf)) = +Inf", __real__ result); - check_isnan ("imag(clog10(NaN + i Inf)) = NaN", __imag__ result); - result = FUNC(clog10) (BUILD_COMPLEX (nan_value, minus_infty)); - check_isinfp ("real(clog10(NaN - i Inf)) = +Inf", __real__ result); - check_isnan ("imag(clog10(NaN - i Inf)) = NaN", __imag__ result); - - result = FUNC(clog10) (BUILD_COMPLEX (0, nan_value)); - check_isnan_maybe_exc ("real(clog10(0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog10(0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog10) (BUILD_COMPLEX (3, nan_value)); - check_isnan_maybe_exc ("real(clog10(3 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog10(3 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog10) (BUILD_COMPLEX (minus_zero, nan_value)); - check_isnan_maybe_exc ("real(clog10(-0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog10(-0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog10) (BUILD_COMPLEX (-3, nan_value)); - check_isnan_maybe_exc ("real(clog10(-3 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog10(-3 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(clog10) (BUILD_COMPLEX (nan_value, 0)); - check_isnan_maybe_exc ("real(clog10(NaN + i0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog10(NaN + i0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog10) (BUILD_COMPLEX (nan_value, 5)); - check_isnan_maybe_exc ("real(clog10(NaN + i5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog10(NaN + i5)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog10) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan_maybe_exc ("real(clog10(NaN - i0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog10(NaN - i0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(clog10) (BUILD_COMPLEX (nan_value, -5)); - check_isnan_maybe_exc ("real(clog10(NaN - i5)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(clog10(NaN - i5)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(clog10) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(clog10(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(clog10(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(clog10) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(clog10(0.7 + i 1.2)) == 0.14277...", __real__ result, - 0.1427786545038868803L, CHOOSE (2e-17L, 6e-17, 2e-8)); - check_eps ("imag(clog10(0.7 + i 1.2)) == 0.45284...", __imag__ result, - 0.4528483579352493248L, CHOOSE (6e-18, 6e-17, 6e-8)); - - result = FUNC(clog10) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(clog10(-2 - i 3)) == 0.55697...", __real__ result, - 0.5569716761534183846L, CHOOSE (6e-20L, 0, 0)); - check_eps ("imag(clog10(-2 - i 3)) == -0.93755...", __imag__ result, - -0.9375544629863747085L, CHOOSE (7e-19L, 2e-16, 3e-7)); -} - - -static void -csqrt_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(csqrt) (BUILD_COMPLEX (0, 0)); - check ("real(csqrt(0 + i0)) = 0", __real__ result, 0); - check ("imag(csqrt(0 + i0)) = 0", __imag__ result, 0); - result = FUNC(csqrt) (BUILD_COMPLEX (0, minus_zero)); - check ("real(csqrt(0 - i0)) = 0", __real__ result, 0); - check ("imag(csqrt(0 - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_zero, 0)); - check ("real(csqrt(-0 + i0)) = 0", __real__ result, 0); - check ("imag(csqrt(-0 + i0)) = 0", __imag__ result, 0); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_zero, minus_zero)); - check ("real(csqrt(-0 - i0)) = 0", __real__ result, 0); - check ("imag(csqrt(-0 - i0)) = -0", __imag__ result, minus_zero); - - result = FUNC(csqrt) (BUILD_COMPLEX (minus_infty, 0)); - check ("real(csqrt(-Inf + i0)) = 0", __real__ result, 0); - check_isinfp ("imag(csqrt(-Inf + i0)) = +Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_infty, 6)); - check ("real(csqrt(-Inf + i6)) = 0", __real__ result, 0); - check_isinfp ("imag(csqrt(-Inf + i6)) = +Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_infty, minus_zero)); - check ("real(csqrt(-Inf - i0)) = 0", __real__ result, 0); - check_isinfn ("imag(csqrt(-Inf - i0)) = -Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_infty, -6)); - check ("real(csqrt(-Inf - i6)) = 0", __real__ result, 0); - check_isinfn ("imag(csqrt(-Inf - i6)) = -Inf", __imag__ result); - - result = FUNC(csqrt) (BUILD_COMPLEX (plus_infty, 0)); - check_isinfp ("real(csqrt(+Inf + i0)) = +Inf", __real__ result); - check ("imag(csqrt(+Inf + i0)) = 0", __imag__ result, 0); - result = FUNC(csqrt) (BUILD_COMPLEX (plus_infty, 6)); - check_isinfp ("real(csqrt(+Inf + i6)) = +Inf", __real__ result); - check ("imag(csqrt(+Inf + i6)) = 0", __imag__ result, 0); - result = FUNC(csqrt) (BUILD_COMPLEX (plus_infty, minus_zero)); - check_isinfp ("real(csqrt(+Inf - i0)) = +Inf", __real__ result); - check ("imag(csqrt(+Inf - i0)) = -0", __imag__ result, minus_zero); - result = FUNC(csqrt) (BUILD_COMPLEX (plus_infty, -6)); - check_isinfp ("real(csqrt(+Inf - i6)) = +Inf", __real__ result); - check ("imag(csqrt(+Inf - i6)) = -0", __imag__ result, minus_zero); - - result = FUNC(csqrt) (BUILD_COMPLEX (0, plus_infty)); - check_isinfp ("real(csqrt(0 + i Inf)) = +Inf", __real__ result); - check_isinfp ("imag(csqrt(0 + i Inf)) = +Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (4, plus_infty)); - check_isinfp ("real(csqrt(4 + i Inf)) = +Inf", __real__ result); - check_isinfp ("imag(csqrt(4 + i Inf)) = +Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (plus_infty, plus_infty)); - check_isinfp ("real(csqrt(+Inf + i Inf)) = +Inf", __real__ result); - check_isinfp ("imag(csqrt(+Inf + i Inf)) = +Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_zero, plus_infty)); - check_isinfp ("real(csqrt(-0 + i Inf)) = +Inf", __real__ result); - check_isinfp ("imag(csqrt(-0 + i Inf)) = +Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (-4, plus_infty)); - check_isinfp ("real(csqrt(-4 + i Inf)) = +Inf", __real__ result); - check_isinfp ("imag(csqrt(-4 + i Inf)) = +Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_infty, plus_infty)); - check_isinfp ("real(csqrt(-Inf + i Inf)) = +Inf", __real__ result); - check_isinfp ("imag(csqrt(-Inf + i Inf)) = +Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (0, minus_infty)); - check_isinfp ("real(csqrt(0 - i Inf)) = +Inf", __real__ result); - check_isinfn ("imag(csqrt(0 - i Inf)) = -Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (4, minus_infty)); - check_isinfp ("real(csqrt(4 - i Inf)) = +Inf", __real__ result); - check_isinfn ("imag(csqrt(4 - i Inf)) = -Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (plus_infty, minus_infty)); - check_isinfp ("real(csqrt(+Inf - i Inf)) = +Inf", __real__ result); - check_isinfn ("imag(csqrt(+Inf - i Inf)) = -Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_zero, minus_infty)); - check_isinfp ("real(csqrt(-0 - i Inf)) = +Inf", __real__ result); - check_isinfn ("imag(csqrt(-0 - i Inf)) = -Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (-4, minus_infty)); - check_isinfp ("real(csqrt(-4 - i Inf)) = +Inf", __real__ result); - check_isinfn ("imag(csqrt(-4 - i Inf)) = -Inf", __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_infty, minus_infty)); - check_isinfp ("real(csqrt(-Inf - i Inf)) = +Inf", __real__ result); - check_isinfn ("imag(csqrt(-Inf - i Inf)) = -Inf", __imag__ result); - - result = FUNC(csqrt) (BUILD_COMPLEX (minus_infty, nan_value)); - check_isnan ("real(csqrt(-Inf + i NaN)) = NaN", __real__ result); - check_isinfp ("imag(csqrt(-Inf + i NaN)) = +-Inf", - FUNC(fabs) (__imag__ result)); - - result = FUNC(csqrt) (BUILD_COMPLEX (plus_infty, nan_value)); - check_isinfp ("real(csqrt(+Inf + i NaN)) = +Inf", __real__ result); - check_isnan ("imag(csqrt(+Inf + i NaN)) = NaN", __imag__ result); - - result = FUNC(csqrt) (BUILD_COMPLEX (0, nan_value)); - check_isnan_maybe_exc ("real(csqrt(0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csqrt(0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (1, nan_value)); - check_isnan_maybe_exc ("real(csqrt(1 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csqrt(1 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (minus_zero, nan_value)); - check_isnan_maybe_exc ("real(csqrt(-0 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csqrt(-0 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (-1, nan_value)); - check_isnan_maybe_exc ("real(csqrt(-1 + i NaN)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csqrt(-1 + i NaN)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(csqrt) (BUILD_COMPLEX (nan_value, 0)); - check_isnan_maybe_exc ("real(csqrt(NaN + i0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csqrt(NaN + i0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (nan_value, 8)); - check_isnan_maybe_exc ("real(csqrt(NaN + i8)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csqrt(NaN + i8)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (nan_value, minus_zero)); - check_isnan_maybe_exc ("real(csqrt(NaN - i0)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csqrt(NaN - i0)) = NaN plus maybe invalid exception", - __imag__ result); - result = FUNC(csqrt) (BUILD_COMPLEX (nan_value, -8)); - check_isnan_maybe_exc ("real(csqrt(NaN - i8)) = NaN plus maybe invalid exception", - __real__ result, INVALID_EXCEPTION); - check_isnan ("imag(csqrt(NaN - i8)) = NaN plus maybe invalid exception", - __imag__ result); - - result = FUNC(csqrt) (BUILD_COMPLEX (nan_value, nan_value)); - check_isnan ("real(csqrt(NaN + i NaN)) = NaN", __real__ result); - check_isnan ("imag(csqrt(NaN + i NaN)) = NaN", __imag__ result); - - result = FUNC(csqrt) (BUILD_COMPLEX (16.0, -30.0)); - check ("real(csqrt(16 - 30i)) = 5", __real__ result, 5.0); - check ("imag(csqrt(16 - 30i)) = -3", __imag__ result, -3.0); - - result = FUNC(csqrt) (BUILD_COMPLEX (-1, 0)); - check ("real(csqrt(1 + i0) = 0", __real__ result, 0); - check ("imag(csqrt(1 + i0) = 1", __imag__ result, 1); - - result = FUNC(csqrt) (BUILD_COMPLEX (0, 2)); - check ("real(csqrt(0 + i 2) = 1", __real__ result, 1); - check ("imag(csqrt(0 + i 2) = 1", __imag__ result, 1); - - result = FUNC(csqrt) (BUILD_COMPLEX (119, 120)); - check ("real(csqrt(119 + i 120) = 12", __real__ result, 12); - check ("imag(csqrt(119 + i 120) = 5", __imag__ result, 5); - - result = FUNC(csqrt) (BUILD_COMPLEX (0.7, 1.2)); - check_eps ("real(csqrt(0.7 + i 1.2)) == 1.02206...", __real__ result, - 1.0220676100300264507L, CHOOSE (3e-17L, 3e-16, 2e-7)); - check_eps ("imag(csqrt(0.7 + i 1.2)) == 0.58704...", __imag__ result, - 0.5870453129635652115L, CHOOSE (7e-18L, 0, 6e-8)); - - result = FUNC(csqrt) (BUILD_COMPLEX (-2, -3)); - check_eps ("real(csqrt(-2 - i 3)) == 0.89597...", __real__ result, - 0.8959774761298381247L, CHOOSE (6e-16L, 4e-16, 6e-8)); - check_eps ("imag(csqrt(-2 - i 3)) == -1.67414...", __imag__ result, - -1.6741492280355400404L, CHOOSE (0, 5e-16, 0)); - - result = FUNC(csqrt) (BUILD_COMPLEX (-2, 3)); - check_eps ("real(csqrt(-2 + i 3)) == 0.89597...", __real__ result, - 0.8959774761298381247L, CHOOSE (6e-20L, 4e-16, 6e-8)); - check_eps ("imag(csqrt(-2 + i 3)) == 1.67414...", __imag__ result, - 1.6741492280355400404L, CHOOSE (0, 5e-16, 0)); -} - - -static void -cpow_test (void) -{ - __complex__ MATHTYPE result; - - result = FUNC(cpow) (BUILD_COMPLEX (1, 0), BUILD_COMPLEX (0, 0)); - check ("real(cpow (1 + i0), (0 + i0)) == 0", __real__ result, 1); - check ("imag(cpow (1 + i0), (0 + i0)) == 0", __imag__ result, 0); - - result = FUNC(cpow) (BUILD_COMPLEX (2, 0), BUILD_COMPLEX (10, 0)); - check_eps ("real(cpow (2 + i0), (10 + i0)) == 1024", __real__ result, 1024, - CHOOSE (6e-16L, 1.2e-13, 0)); - check ("imag(cpow (2 + i0), (10 + i0)) == 0", __imag__ result, 0); - - result = FUNC(cpow) (BUILD_COMPLEX (M_El, 0), BUILD_COMPLEX (0, 2 * M_PIl)); - check_eps ("real(cpow (e + i0), (0 + i 2*PI)) == 1", __real__ result, 1, - CHOOSE (0, 0, 6e-8)); - check_eps ("imag(cpow (e + i0), (0 + i 2*PI)) == 0", __imag__ result, 0, - CHOOSE (3e-18L, 3e-16, 4e-7)); - - result = FUNC(cpow) (BUILD_COMPLEX (2, 3), BUILD_COMPLEX (4, 0)); - check_eps ("real(cpow (2 + i3), (4 + i0)) == -119", __real__ result, -119, - CHOOSE (9e-16L, 2e-14, 4e-5)); - check_eps ("imag(cpow (2 + i3), (4 + i0)) == -120", __imag__ result, -120, - CHOOSE (1e-15L, 0, 5e-5)); -} - - -static void -cabs_test (void) -{ - /* cabs (x + iy) is specified as hypot (x,y) */ - MATHTYPE a; - a = random_greater (0); - check_isinfp_ext ("cabs (+inf + i x) == +inf", - FUNC(cabs) (BUILD_COMPLEX (plus_infty, a)), a); - check_isinfp_ext ("cabs (-inf + i x) == +inf", - FUNC(cabs) (BUILD_COMPLEX (minus_infty, a)), a); - - check_isinfp ("cabs (+inf+ iNaN) == +inf", - FUNC(cabs) (BUILD_COMPLEX (minus_infty, nan_value))); - check_isinfp ("cabs (-inf+ iNaN) == +inf", - FUNC(cabs) (BUILD_COMPLEX (minus_infty, nan_value))); - - check_isnan ("cabs (NaN+ iNaN) == NaN", - FUNC(cabs) (BUILD_COMPLEX (nan_value, nan_value))); - - a = FUNC(cabs) (BUILD_COMPLEX (12.4L, 0.7L)); - check ("cabs (x,y) == cabs (y,x)", - FUNC(cabs) (BUILD_COMPLEX (0.7L, 12.4L)), a); - check ("cabs (x,y) == cabs (-x,y)", - FUNC(cabs) (BUILD_COMPLEX (-12.4L, 0.7L)), a); - check ("cabs (x,y) == cabs (-y,x)", - FUNC(cabs) (BUILD_COMPLEX (-0.7L, 12.4L)), a); - check ("cabs (x,y) == cabs (-x,-y)", - FUNC(cabs) (BUILD_COMPLEX (-12.4L, -0.7L)), a); - check ("cabs (x,y) == cabs (-y,-x)", - FUNC(cabs) (BUILD_COMPLEX (-0.7L, -12.4L)), a); - check ("cabs (x,0) == fabs (x)", FUNC(cabs) (BUILD_COMPLEX (-0.7L, 0)), 0.7L); - check ("cabs (x,0) == fabs (x)", FUNC(cabs) (BUILD_COMPLEX (0.7L, 0)), 0.7L); - check ("cabs (x,0) == fabs (x)", FUNC(cabs) (BUILD_COMPLEX (-1.0L, 0)), 1.0L); - check ("cabs (x,0) == fabs (x)", FUNC(cabs) (BUILD_COMPLEX (1.0L, 0)), 1.0L); - check ("cabs (x,0) == fabs (x)", FUNC(cabs) (BUILD_COMPLEX (-5.7e7L, 0)), - 5.7e7L); - check ("cabs (x,0) == fabs (x)", FUNC(cabs) (BUILD_COMPLEX (5.7e7L, 0)), - 5.7e7L); - - check_eps ("cabs (0.7 + i 1.2) == 1.38924...", FUNC(cabs) (BUILD_COMPLEX (0.7, 1.2)), - 1.3892443989449804508L, CHOOSE (7e-17L, 3e-16, 0)); -} - - -static void -carg_test (void) -{ - /* carg (x + iy) is specified as atan2 (y, x) */ - MATHTYPE x; - - x = random_greater (0); - check ("carg (x + i 0) == 0 for x > 0", - FUNC(carg) (BUILD_COMPLEX (x, 0)), 0); - x = random_greater (0); - check ("carg (x - i 0) == -0 for x > 0", - FUNC(carg) (BUILD_COMPLEX (x, minus_zero)), minus_zero); - - check ("carg (+0 + i 0) == +0", FUNC(carg) (BUILD_COMPLEX (0, 0)), 0); - check ("carg (+0 - i 0) == -0", FUNC(carg) (BUILD_COMPLEX (0, minus_zero)), - minus_zero); - - x = -random_greater (0); - check ("carg (x + i 0) == +pi for x < 0", FUNC(carg) (BUILD_COMPLEX (x, 0)), - M_PIl); - - x = -random_greater (0); - check ("carg (x - i 0) == -pi for x < 0", - FUNC(carg) (BUILD_COMPLEX (x, minus_zero)), -M_PIl); - - check ("carg (-0 + i 0) == +pi", FUNC(carg) (BUILD_COMPLEX (minus_zero, 0)), - M_PIl); - check ("carg (-0 - i 0) == -pi", - FUNC(carg) (BUILD_COMPLEX (minus_zero, minus_zero)), -M_PIl); - - x = random_greater (0); - check ("carg (+0 + i y) == pi/2 for y > 0", FUNC(carg) (BUILD_COMPLEX (0, x)), - M_PI_2l); - - x = random_greater (0); - check ("carg (-0 + i y) == pi/2 for y > 0", - FUNC(carg) (BUILD_COMPLEX (minus_zero, x)), M_PI_2l); - - x = random_less (0); - check ("carg (+0 + i y) == -pi/2 for y < 0", FUNC(carg) (BUILD_COMPLEX (0, x)), - -M_PI_2l); - - x = random_less (0); - check ("carg (-0 + i y) == -pi/2 for y < 0", - FUNC(carg) (BUILD_COMPLEX (minus_zero, x)), -M_PI_2l); - - x = random_greater (0); - check ("carg (inf + i y) == +0 for finite y > 0", - FUNC(carg) (BUILD_COMPLEX (plus_infty, x)), 0); - - x = -random_greater (0); - check ("carg (inf + i y) == -0 for finite y < 0", - FUNC(carg) (BUILD_COMPLEX (plus_infty, x)), minus_zero); - - x = random_value (-1e4, 1e4); - check ("carg(x + i inf) == pi/2 for finite x", - FUNC(carg) (BUILD_COMPLEX (x, plus_infty)), M_PI_2l); - - x = random_value (-1e4, 1e4); - check ("carg(x - i inf) == -pi/2 for finite x", - FUNC(carg) (BUILD_COMPLEX (x, minus_infty)), -M_PI_2l); - - x = random_greater (0); - check ("carg (-inf + i y) == +pi for finite y > 0", - FUNC(carg) (BUILD_COMPLEX (minus_infty, x)), M_PIl); - - x = -random_greater (0); - check ("carg (-inf + i y) == -pi for finite y < 0", - FUNC(carg) (BUILD_COMPLEX (minus_infty, x)), -M_PIl); - - check ("carg (+inf + i inf) == +pi/4", - FUNC(carg) (BUILD_COMPLEX (plus_infty, plus_infty)), M_PI_4l); - - check ("carg (+inf -i inf) == -pi/4", - FUNC(carg) (BUILD_COMPLEX (plus_infty, minus_infty)), -M_PI_4l); - - check ("carg (-inf +i inf) == +3*pi/4", - FUNC(carg) (BUILD_COMPLEX (minus_infty, plus_infty)), 3 * M_PI_4l); - - check ("carg (-inf -i inf) == -3*pi/4", - FUNC(carg) (BUILD_COMPLEX (minus_infty, minus_infty)), -3 * M_PI_4l); -} - - -static void -nearbyint_test (void) -{ - check ("nearbyint(+0) = 0", FUNC(nearbyint) (0.0), 0.0); - check ("nearbyint(-0) = -0", FUNC(nearbyint) (minus_zero), minus_zero); - check_isinfp ("nearbyint(+Inf) = +Inf", FUNC(nearbyint) (plus_infty)); - check_isinfn ("nearbyint(-Inf) = -Inf", FUNC(nearbyint) (minus_infty)); -} - - -static void -rint_test (void) -{ - check ("rint(0) = 0", FUNC(rint) (0.0), 0.0); - check ("rint(-0) = -0", FUNC(rint) (minus_zero), minus_zero); - check_isinfp ("rint(+Inf) = +Inf", FUNC(rint) (plus_infty)); - check_isinfn ("rint(-Inf) = -Inf", FUNC(rint) (minus_infty)); -} - - -static void -lrint_test (void) -{ - /* XXX this test is incomplete. We need to have a way to specifiy - the rounding method and test the critical cases. So far, only - unproblematic numbers are tested. */ - - check_long ("lrint(0) = 0", FUNC(lrint) (0.0), 0); - check_long ("lrint(-0) = 0", FUNC(lrint) (minus_zero), 0); - check_long ("lrint(0.2) = 0", FUNC(lrint) (0.2), 0); - check_long ("lrint(-0.2) = 0", FUNC(lrint) (-0.2), 0); - - check_long ("lrint(1.4) = 1", FUNC(lrint) (1.4), 1); - check_long ("lrint(-1.4) = -1", FUNC(lrint) (-1.4), -1); - - check_long ("lrint(8388600.3) = 8388600", FUNC(lrint) (8388600.3), 8388600); - check_long ("lrint(-8388600.3) = -8388600", FUNC(lrint) (-8388600.3), - -8388600); -} - - -static void -llrint_test (void) -{ - /* XXX this test is incomplete. We need to have a way to specifiy - the rounding method and test the critical cases. So far, only - unproblematic numbers are tested. */ - - check_longlong ("llrint(0) = 0", FUNC(llrint) (0.0), 0); - check_longlong ("llrint(-0) = 0", FUNC(llrint) (minus_zero), 0); - check_longlong ("llrint(0.2) = 0", FUNC(llrint) (0.2), 0); - check_longlong ("llrint(-0.2) = 0", FUNC(llrint) (-0.2), 0); - - check_longlong ("llrint(1.4) = 1", FUNC(llrint) (1.4), 1); - check_longlong ("llrint(-1.4) = -1", FUNC(llrint) (-1.4), -1); - - check_longlong ("llrint(8388600.3) = 8388600", FUNC(llrint) (8388600.3), - 8388600); - check_longlong ("llrint(-8388600.3) = -8388600", FUNC(llrint) (-8388600.3), - -8388600); - - /* Test boundary conditions. */ - /* 0x1FFFFF */ - check_longlong ("llrint(2097151.0) = 2097151", FUNC(llrint) (2097151.0), - 2097151LL); - /* 0x800000 */ - check_longlong ("llrint(8388608.0) = 8388608", FUNC(llrint) (8388608.0), - 8388608LL); - /* 0x1000000 */ - check_longlong ("llrint(16777216.0) = 16777216", - FUNC(llrint) (16777216.0), 16777216LL); - /* 0x20000000000 */ - check_longlong ("llrint(2199023255552.0) = 2199023255552", - FUNC(llrint) (2199023255552.0), 2199023255552LL); - /* 0x40000000000 */ - check_longlong ("llrint(4398046511104.0) = 4398046511104", - FUNC(llrint) (4398046511104.0), 4398046511104LL); - /* 0x10000000000000 */ - check_longlong ("llrint(4503599627370496.0) = 4503599627370496", - FUNC(llrint) (4503599627370496.0), 4503599627370496LL); - /* 0x10000080000000 */ - check_longlong ("llrint(4503601774854144.0) = 4503601774854144", - FUNC(llrint) (4503601774854144.0), 4503601774854144LL); - /* 0x20000000000000 */ - check_longlong ("llrint(9007199254740992.0) = 9007199254740992", - FUNC(llrint) (9007199254740992.0), 9007199254740992LL); - /* 0x80000000000000 */ - check_longlong ("llrint(36028797018963968.0) = 36028797018963968", - FUNC(llrint) (36028797018963968.0), 36028797018963968LL); - /* 0x100000000000000 */ - check_longlong ("llrint(72057594037927936.0) = 72057594037927936", - FUNC(llrint) (72057594037927936.0), 72057594037927936LL); -} - - -static void -round_test (void) -{ - check ("round(0) = 0", FUNC(round) (0), 0); - check ("round(-0) = -0", FUNC(round) (minus_zero), minus_zero); - check ("round(0.2) = 0", FUNC(round) (0.2), 0.0); - check ("round(-0.2) = -0", FUNC(round) (-0.2), minus_zero); - check ("round(0.5) = 1", FUNC(round) (0.5), 1.0); - check ("round(-0.5) = -1", FUNC(round) (-0.5), -1.0); - check ("round(0.8) = 1", FUNC(round) (0.8), 1.0); - check ("round(-0.8) = -1", FUNC(round) (-0.8), -1.0); - check ("round(1.5) = 2", FUNC(round) (1.5), 2.0); - check ("round(-1.5) = -2", FUNC(round) (-1.5), -2.0); - check ("round(2097152.5) = 2097153", FUNC(round) (2097152.5), 2097153); - check ("round(-2097152.5) = -2097153", FUNC(round) (-2097152.5), -2097153); -} - - -static void -lround_test (void) -{ - check_long ("lround(0) = 0", FUNC(lround) (0), 0); - check_long ("lround(-0) = 0", FUNC(lround) (minus_zero), 0); - check_long ("lround(0.2) = 0", FUNC(lround) (0.2), 0.0); - check_long ("lround(-0.2) = 0", FUNC(lround) (-0.2), 0); - check_long ("lround(0.5) = 1", FUNC(lround) (0.5), 1); - check_long ("lround(-0.5) = -1", FUNC(lround) (-0.5), -1); - check_long ("lround(0.8) = 1", FUNC(lround) (0.8), 1); - check_long ("lround(-0.8) = -1", FUNC(lround) (-0.8), -1); - check_long ("lround(1.5) = 2", FUNC(lround) (1.5), 2); - check_long ("lround(-1.5) = -2", FUNC(lround) (-1.5), -2); - check_long ("lround(22514.5) = 22515", FUNC(lround) (22514.5), 22515); - check_long ("lround(-22514.5) = -22515", FUNC(lround) (-22514.5), -22515); -#ifndef TEST_FLOAT - check_long ("lround(2097152.5) = 2097153", FUNC(lround) (2097152.5), - 2097153); - check_long ("lround(-2097152.5) = -2097153", FUNC(lround) (-2097152.5), - -2097153); -#endif -} - - -static void -llround_test (void) -{ - check_longlong ("llround(0) = 0", FUNC(llround) (0), 0); - check_longlong ("llround(-0) = 0", FUNC(llround) (minus_zero), 0); - check_longlong ("llround(0.2) = 0", FUNC(llround) (0.2), 0.0); - check_longlong ("llround(-0.2) = 0", FUNC(llround) (-0.2), 0); - check_longlong ("llround(0.5) = 1", FUNC(llround) (0.5), 1); - check_longlong ("llround(-0.5) = -1", FUNC(llround) (-0.5), -1); - check_longlong ("llround(0.8) = 1", FUNC(llround) (0.8), 1); - check_longlong ("llround(-0.8) = -1", FUNC(llround) (-0.8), -1); - check_longlong ("llround(1.5) = 2", FUNC(llround) (1.5), 2); - check_longlong ("llround(-1.5) = -2", FUNC(llround) (-1.5), -2); - check_longlong ("llround(22514.5) = 22515", FUNC(llround) (22514.5), 22515); - check_longlong ("llround(-22514.5) = -22515", FUNC(llround) (-22514.5), - -22515); -#ifndef TEST_FLOAT - check_longlong ("llround(2097152.5) = 2097153", - FUNC(llround) (2097152.5), 2097153); - check_longlong ("llround(-2097152.5) = -2097153", - FUNC(llround) (-2097152.5), -2097153); - check_longlong ("llround(34359738368.5) = 34359738369", - FUNC(llround) (34359738368.5), 34359738369ll); - check_longlong ("llround(-34359738368.5) = -34359738369", - FUNC(llround) (-34359738368.5), -34359738369ll); -#endif - - /* Test boundary conditions. */ - /* 0x1FFFFF */ - check_longlong ("llround(2097151.0) = 2097151", FUNC(llround) (2097151.0), - 2097151LL); - /* 0x800000 */ - check_longlong ("llround(8388608.0) = 8388608", FUNC(llround) (8388608.0), - 8388608LL); - /* 0x1000000 */ - check_longlong ("llround(16777216.0) = 16777216", - FUNC(llround) (16777216.0), 16777216LL); - /* 0x20000000000 */ - check_longlong ("llround(2199023255552.0) = 2199023255552", - FUNC(llround) (2199023255552.0), 2199023255552LL); - /* 0x40000000000 */ - check_longlong ("llround(4398046511104.0) = 4398046511104", - FUNC(llround) (4398046511104.0), 4398046511104LL); - /* 0x10000000000000 */ - check_longlong ("llround(4503599627370496.0) = 4503599627370496", - FUNC(llround) (4503599627370496.0), 4503599627370496LL); - /* 0x10000080000000 */ - check_longlong ("llrint(4503601774854144.0) = 4503601774854144", - FUNC(llrint) (4503601774854144.0), 4503601774854144LL); - /* 0x20000000000000 */ - check_longlong ("llround(9007199254740992.0) = 9007199254740992", - FUNC(llround) (9007199254740992.0), 9007199254740992LL); - /* 0x80000000000000 */ - check_longlong ("llround(36028797018963968.0) = 36028797018963968", - FUNC(llround) (36028797018963968.0), 36028797018963968LL); - /* 0x100000000000000 */ - check_longlong ("llround(72057594037927936.0) = 72057594037927936", - FUNC(llround) (72057594037927936.0), 72057594037927936LL); -} - - -static void -fma_test (void) -{ - check ("fma(1.0, 2.0, 3.0) = 5.0", FUNC(fma) (1.0, 2.0, 3.0), 5.0); - check_isnan ("fma(NaN, 2.0, 3.0) = NaN", FUNC(fma) (nan_value, 2.0, 3.0)); - check_isnan ("fma(1.0, NaN, 3.0) = NaN", FUNC(fma) (1.0, nan_value, 3.0)); - check_isnan_maybe_exc ("fma(1.0, 2.0, NaN) = NaN", - FUNC(fma) (1.0, 2.0, nan_value), INVALID_EXCEPTION); - check_isnan_maybe_exc ("fma(+Inf, 0.0, NaN) = NaN", - FUNC(fma) (plus_infty, 0.0, nan_value), - INVALID_EXCEPTION); - check_isnan_maybe_exc ("fma(-Inf, 0.0, NaN) = NaN", - FUNC(fma) (minus_infty, 0.0, nan_value), - INVALID_EXCEPTION); - check_isnan_maybe_exc ("fma(0.0, +Inf, NaN) = NaN", - FUNC(fma) (0.0, plus_infty, nan_value), - INVALID_EXCEPTION); - check_isnan_maybe_exc ("fma(0.0, -Inf, NaN) = NaN", - FUNC(fma) (0.0, minus_infty, nan_value), - INVALID_EXCEPTION); - check_isnan_exc ("fma(+Inf, 0.0, 1.0) = NaN", - FUNC(fma) (plus_infty, 0.0, 1.0), INVALID_EXCEPTION); - check_isnan_exc ("fma(-Inf, 0.0, 1.0) = NaN", - FUNC(fma) (minus_infty, 0.0, 1.0), INVALID_EXCEPTION); - check_isnan_exc ("fma(0.0, +Inf, 1.0) = NaN", - FUNC(fma) (0.0, plus_infty, 1.0), INVALID_EXCEPTION); - check_isnan_exc ("fma(0.0, -Inf, 1.0) = NaN", - FUNC(fma) (0.0, minus_infty, 1.0), INVALID_EXCEPTION); - - check_isnan_exc ("fma(+Inf, +Inf, -Inf) = NaN", - FUNC(fma) (plus_infty, plus_infty, minus_infty), - INVALID_EXCEPTION); - check_isnan_exc ("fma(-Inf, +Inf, +Inf) = NaN", - FUNC(fma) (minus_infty, plus_infty, plus_infty), - INVALID_EXCEPTION); - check_isnan_exc ("fma(+Inf, -Inf, +Inf) = NaN", - FUNC(fma) (plus_infty, minus_infty, plus_infty), - INVALID_EXCEPTION); - check_isnan_exc ("fma(-Inf, -Inf, -Inf) = NaN", - FUNC(fma) (minus_infty, minus_infty, minus_infty), - INVALID_EXCEPTION); -} - -static void -j0_test (void) -{ - errno = 0; - FUNC(j0) (0); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - /* j0 is the Bessel function of the first kind of order 0 */ - check_isnan ("j0 (NaN) = NaN", FUNC(j0) (nan_value)); - check ("j0 (+Inf) = 0", FUNC(j0) (plus_infty), 0); - check ("j0 (-1.0) = 0.76519...", FUNC(j0) (-1.0), 0.76519768655796655145); - check ("j0 (0) = 1", FUNC(j0) (0.0), 1.0); - check ("j0 (0.1) = 0.99750...", FUNC(j0) (0.1), 0.99750156206604003228); - check ("j0 (0.7) = 0.88120...", FUNC(j0) (0.7), 0.88120088860740528084); - check ("j0 (1.0) = 0.76519...", FUNC(j0) (1.0), 0.76519768655796655145); - check_eps ("j0 (1.5) = 0.51182...", FUNC(j0) (1.5), 0.51182767173591812875, - CHOOSE (0, 0, 6e-8)); - check_eps ("j0 (2.0) = 0.22389...", FUNC(j0) (2.0), 0.22389077914123566805, - CHOOSE(0, 3e-17, 3e-8)); - check_eps ("j0 (8.0) = 0.17165...", FUNC(j0) (8.0), 0.17165080713755390609, - CHOOSE(0, 0, 1.5e-8)); - check_eps ("j0 (10.0) = -0.24593...", FUNC(j0) (10.0), -0.24593576445134833520, - CHOOSE(0, 6e-17, 5e-8)); -} - -static void -j1_test (void) -{ - errno = 0; - FUNC(j1) (0); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - /* j1 is the Bessel function of the first kind of order 1 */ - check_isnan ("j1 (NaN) = NaN", FUNC(j1) (nan_value)); - check ("j1 (+Inf) = 0", FUNC(j1) (plus_infty), 0); - - check_eps ("j1 (-1.0) = -0.44005...", FUNC(j1) (-1.0), - -0.44005058574493351596, CHOOSE (0, 0, 3e-8)); - check ("j1 (0) = 0", FUNC(j1) (0.0), 0.0); - check ("j1 (0.1) = 0.049937...", FUNC(j1) (0.1), 0.049937526036241997556); - check ("j1 (0.7) = 0.32899...", FUNC(j1) (0.7), 0.32899574154005894785); - check_eps ("j1 (1.0) = 0.44005...", FUNC(j1) (1.0), 0.44005058574493351596, - CHOOSE (0, 0, 3e-8)); - check_eps ("j1 (1.5) = 0.55793...", FUNC(j1) (1.5), 0.55793650791009964199, - CHOOSE (0, 0, 6e-8)); - check_eps ("j1 (2.0) = 0.57672...", FUNC(j1) (2.0), 0.57672480775687338720, - CHOOSE(0, 2e-16, 0)); - check_eps ("j1 (8.0) = 0.23463...", FUNC(j1) (8.0), 0.23463634685391462438, - CHOOSE(0, 3e-17, 1.5e-8)); - check_eps ("j1 (10.0) = 0.04347...", FUNC(j1) (10.0), 0.043472746168861436670, - CHOOSE(0, 2e-17, 7.5e-9)); -} - -static void -jn_test (void) -{ - errno = 0; - FUNC(jn) (1, 1); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - /* jn is the Bessel function of the first kind of order n. */ - - /* jn (0, x) == j0 (x) */ - check_isnan ("jn (0, NaN) = NaN", FUNC(jn) (0, nan_value)); - check ("jn (0, +Inf) = 0", FUNC(jn) (0, plus_infty), 0); - check ("jn (0, -1.0) = 0.76519...", FUNC(jn) (0, -1.0), 0.76519768655796655145); - check ("jn (0, 0.0) = 1", FUNC(jn) (0, 0.0), 1.0); - check ("jn (0, 0.1) = 0.99750...", FUNC(jn) (0, 0.1), 0.99750156206604003228); - check ("jn (0, 0.7) = 0.88120...", FUNC(jn) (0, 0.7), 0.88120088860740528084); - check ("jn (0, 1.0) = 0.76519...", FUNC(jn) (0, 1.0), 0.76519768655796655145); - check_eps ("jn (0, 1.5) = 0.51182...", FUNC(jn) (0, 1.5), - 0.51182767173591812875, CHOOSE (0, 0, 6e-8)); - check_eps ("jn (0, 2.0) = 0.22389...", FUNC(jn) (0, 2.0), 0.22389077914123566805, - CHOOSE(0, 3e-17, 3e-8)); - check_eps ("jn (0, 8.0) = 0.17165...", FUNC(jn) (0, 8.0), 0.17165080713755390609, - CHOOSE(0, 0, 1.5e-8)); - check_eps ("jn (0, 10.0) = -0.24593...", FUNC(jn) (0, 10.0), -0.24593576445134833520, - CHOOSE(0, 6e-17, 4.5e-8)); - - /* jn (1, x) == j1 (x) */ - check_isnan ("jn (1, NaN) = NaN", FUNC(jn) (1, nan_value)); - check ("jn (1, +Inf) = 0", FUNC(jn) (1, plus_infty), 0); - - check_eps ("jn (1, -1.0) = -0.44005...", FUNC(jn) (1, -1.0), - -0.44005058574493351596, CHOOSE (0, 0, 3e-8)); - check ("jn (1, 0.0) = 0", FUNC(jn) (1, 0.0), 0.0); - check ("jn (1, 0.1) = 0.049937...", FUNC(jn) (1, 0.1), 0.049937526036241997556); - check ("jn (1, 0.7) = 0.32899...", FUNC(jn) (1, 0.7), 0.32899574154005894785); - check_eps ("jn (1, 1.0) = 0.44005...", FUNC(jn) (1, 1.0), - 0.44005058574493351596, CHOOSE (0, 0, 3e-8)); - check_eps ("jn (1, 1.5) = 0.55793...", FUNC(jn) (1, 1.5), - 0.55793650791009964199, CHOOSE (0, 0, 6e-8)); - check_eps ("jn (1, 2.0) = 0.57672...", FUNC(jn) (1, 2.0), 0.57672480775687338720, - CHOOSE(0, 2e-16, 0)); - check_eps ("jn (1, 8.0) = 0.23463...", FUNC(jn) (1, 8.0), 0.23463634685391462438, - CHOOSE(0, 3e-17, 1.5e-8)); - check_eps ("jn (1, 10.0) = 0.04347...", FUNC(jn) (1, 10.0), 0.043472746168861436670, - CHOOSE(0, 2e-17, 7.5e-9)); - - /* jn (3, x) */ - check_isnan ("jn (3, NaN) = NaN", FUNC(jn) (3, nan_value)); - check ("jn (3, +Inf) = 0", FUNC(jn) (3, plus_infty), 0); - - check_eps ("jn (3, -1.0) = -0.01956...", FUNC(jn) (3, -1.0), - -0.019563353982668405919, CHOOSE (0, 0, 1.9e-9)); - check ("jn (3, 0.0) = 0", FUNC(jn) (3, 0.0), 0.0); - check_eps ("jn (3, 0.1) = 2.082...*10^-6", FUNC(jn) (3, 0.1), 0.000020820315754756261429, - CHOOSE(0, 4e-21, 0)); - check_eps ("jn (3, 0.7) = 0.00692...", FUNC(jn) (3, 0.7), 0.0069296548267508408077, - CHOOSE(0, 2e-18, 5e-10)); - check_eps ("jn (3, 1.0) = 0.01956...", FUNC(jn) (3, 1.0), - 0.019563353982668405919, CHOOSE (0, 0, 1.9e-9)); - check_eps ("jn (3, 2.0) = 0.12894...", FUNC(jn) (3, 2.0), 0.12894324947440205110, - CHOOSE(0, 3e-17, 3e-8)); - check_eps ("jn (3, 10.0) = 0.05837...", FUNC(jn) (3, 10.0), 0.058379379305186812343, - CHOOSE(0, 3e-17, 1.9e-8)); - - /* jn (10, x) */ - check_isnan ("jn (10, NaN) = NaN", FUNC(jn) (10, nan_value)); - check ("jn (10, +Inf) = 0", FUNC(jn) (10, plus_infty), 0); - - check_eps ("jn (10, -1.0) = 2.6306...*10^-10", FUNC(jn) (10, -1.0), 0.26306151236874532070e-9, - CHOOSE(0, 0, 5.6e-17)); - check ("jn (10, 0) = 0", FUNC(jn) (10, 0.0), 0.0); - check_eps ("jn (10, 0.1) = 2.6905...*10^-20", FUNC(jn) (10, 0.1), 0.26905328954342155795e-19, - CHOOSE(0, 2e-35, 9.7e-27)); - check_eps ("jn (10, 0.7) = 7.517...*10^-12", FUNC(jn) (10, 0.7), 0.75175911502153953928e-11, - CHOOSE(0, 7e-27, 1.8e-18)); - check_eps ("jn (10, 1.0) = 2.630...*10^-10", FUNC(jn) (10, 1.0), 0.26306151236874532070e-9, - CHOOSE(0, 0, 5.6e-17)); - check_eps ("jn (10, 2.0) = 2.515...*10^-7", FUNC(jn) (10, 2.0), 0.25153862827167367096e-6, - CHOOSE(0, 2e-22, 1.2e-13)); - check_eps ("jn (10, 10.0) = 0.20748...", FUNC(jn) (10, 10.0), 0.20748610663335885770, - CHOOSE(0, 2e-16, 1.4e-7)); -} - -static void -y0_test (void) -{ - errno = 0; - FUNC(y0) (1); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - /* y0 is the Bessel function of the second kind of order 0 */ - check_isinfn ("y0 (-1.0) = -inf", FUNC(y0) (-1.0)); - check_isinfn ("y0 (0) = -inf", FUNC(y0) (0.0)); - check_isnan ("y0 (NaN) = NaN", FUNC(y0) (nan_value)); - check ("y0 (+Inf) = 0", FUNC(y0) (plus_infty), 0); - - check_eps ("y0 (0.1) = -1.53423...", FUNC(y0) (0.1), -1.5342386513503668441, - CHOOSE(0, 3e-16, 2.4e-7)); - check_eps ("y0 (0.7) = -0.19066...", FUNC(y0) (0.7), -0.19066492933739506743, - CHOOSE(0, 6e-17, 1.5e-8)); - check_eps ("y0 (1.0) = 0.08825...", FUNC(y0) (1.0), 0.088256964215676957983, - CHOOSE(0, 3e-17, 7.5e-9)); - check_eps ("y0 (1.5) = 0.38244...", FUNC(y0) (1.5), 0.38244892379775884396, - CHOOSE(0, 1.2e-16, 3.0e-8)); - check_eps ("y0 (2.0) = 0.51037...", FUNC(y0) (2.0), 0.51037567264974511960, - CHOOSE(0, 2e-16, 6e-8)); - check_eps ("y0 (8.0) = 0.22352...", FUNC(y0) (8.0), 0.22352148938756622053, - CHOOSE(0, 3e-17, 1.5e-8)); - check_eps ("y0 (10.0) = 0.05567...", FUNC(y0) (10.0), 0.055671167283599391424, - CHOOSE(0, 2e-17, 3.8e-9)); -} - - -static void -y1_test (void) -{ - errno = 0; - FUNC(y1) (1); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - /* y1 is the Bessel function of the second kind of order 1 */ - check_isinfn ("y1 (-1.0) = -inf", FUNC(y1) (-1.0)); - check_isinfn ("y1 (0) = -inf", FUNC(y1) (0.0)); - check ("y1 (+Inf) = 0", FUNC(y1) (plus_infty), 0); - check_isnan ("y1 (NaN) = NaN", FUNC(y1) (nan_value)); - - check_eps ("y1 (0.1) = -6.45895...", FUNC(y1) (0.1), -6.4589510947020269877, - CHOOSE(0, 9e-16, 9.6e-7)); - check_eps ("y1 (0.7) = -1.10324...", FUNC(y1) (0.7), -1.1032498719076333697, - CHOOSE(0, 3e-16, 1.2e-7)); - check_eps ("y1 (1.0) = -0.78121...", FUNC(y1) (1.0), -0.78121282130028871655, - CHOOSE(0, 2e-16, 0)); - check_eps ("y1 (1.5) = -0.41230...", FUNC(y1) (1.5), -0.41230862697391129595, - CHOOSE (0, 0, 6e-8)); - check_eps ("y1 (2.0) = -0.10703...", FUNC(y1) (2.0), -0.10703243154093754689, - CHOOSE(0, 2e-17, 1.5e-8)); - check_eps ("y1 (8.0) = -0.15806...", FUNC(y1) (8.0), -0.15806046173124749426, - CHOOSE(0, 3e-17, 3.0e-8)); - check_eps ("y1 (10.0) = 0.24901...", FUNC(y1) (10.0), 0.24901542420695388392, - CHOOSE(0, 9e-17, 3.0e-8)); -} - -static void -yn_test (void) -{ - errno = 0; - FUNC(yn) (1, 1); - if (errno == ENOSYS) - /* Function not implemented. */ - return; - - /* yn is the Bessel function of the second kind of order n */ - - /* yn (0, x) == y0 (x) */ - check_isinfn ("yn (0, -1.0) = -inf", FUNC(yn) (0, -1.0)); - check_isinfn ("yn (0, 0) = -inf", FUNC(yn) (0, 0.0)); - check_isnan ("yn (0, NaN) = NaN", FUNC(yn) (0, nan_value)); - check ("yn (0, +Inf) = 0", FUNC(yn) (0, plus_infty), 0); - - check_eps ("yn (0, 0.1) = -1.53423...", FUNC(yn) (0, 0.1), -1.5342386513503668441, - CHOOSE(0, 3e-16, 9.6e-7)); - check_eps ("yn (0, 0.7) = -0.19066...", FUNC(yn) (0, 0.7), -0.19066492933739506743, - CHOOSE(0, 6e-17, 1.2e-7)); - check_eps ("yn (0, 1.0) = 0.08825...", FUNC(yn) (0, 1.0), 0.088256964215676957983, - CHOOSE(0, 3e-17, 3e-8)); - check_eps ("yn (0, 1.5) = 0.38244...", FUNC(yn) (0, 1.5), 0.38244892379775884396, - CHOOSE(0, 1.2e-16, 3e-8)); - check_eps ("yn (0, 2.0) = 0.51037...", FUNC(yn) (0, 2.0), 0.51037567264974511960, - CHOOSE(0, 2e-16, 6e-8)); - check_eps ("yn (0, 8.0) = 0.22352...", FUNC(yn) (0, 8.0), 0.22352148938756622053, - CHOOSE(0, 3e-17, 1.5e-8)); - check_eps ("yn (0, 10.0) = 0.05567...", FUNC(yn) (0, 10.0), 0.055671167283599391424, - CHOOSE(0, 2e-17, 3.8e-8)); - - /* yn (1, x) == y1 (x) */ - check_isinfn ("yn (1, -1.0) = -inf", FUNC(yn) (1, -1.0)); - check_isinfn ("yn (1, 0) = -inf", FUNC(yn) (1, 0.0)); - check ("yn (1, +Inf) = 0", FUNC(yn) (1, plus_infty), 0); - check_isnan ("yn (1, NaN) = NaN", FUNC(yn) (1, nan_value)); - - check_eps ("yn (1, 0.1) = -6.45895...", FUNC(yn) (1, 0.1), -6.4589510947020269877, - CHOOSE(0, 9e-16, 9.6e-7)); - check_eps ("yn (1, 0.7) = -1.10324...", FUNC(yn) (1, 0.7), -1.1032498719076333697, - CHOOSE(0, 3e-16, 1.2e-7)); - check_eps ("yn (1, 1.0) = -0.78121...", FUNC(yn) (1, 1.0), -0.78121282130028871655, - CHOOSE(0, 2e-16, 0)); - check_eps ("yn (1, 1.5) = -0.41230...", FUNC(yn) (1, 1.5), -0.41230862697391129595, - CHOOSE (0, 0, 3e-8)); - check_eps ("yn (1, 2.0) = -0.10703...", FUNC(yn) (1, 2.0), -0.10703243154093754689, - CHOOSE(0, 2e-17, 2e-8)); - check_eps ("yn (1, 8.0) = -0.15806...", FUNC(yn) (1, 8.0), -0.15806046173124749426, - CHOOSE(0, 3e-17, 3e-8)); - check_eps ("yn (1, 10.0) = 0.24901...", FUNC(yn) (1, 10.0), 0.24901542420695388392, - CHOOSE(0, 9e-17, 3e-8)); - - /* yn (3, x) */ - check ("yn (3, +Inf) = 0", FUNC(yn) (3, plus_infty), 0); - check_isnan ("yn (3, NaN) = NaN", FUNC(yn) (3, nan_value)); - - check_eps ("yn (3, 0.1) = -5099.3...", FUNC(yn) (3, 0.1), -5099.3323786129048894, - CHOOSE(0, 1e-12, 9.8e-4)); - check_eps ("yn (3, 0.7) = -15.819...", FUNC(yn) (3, 0.7), -15.819479052819633505, - CHOOSE(0, 6e-15, 9.6e-7)); - check ("yn (3, 1.0) = -5.8215...", FUNC(yn) (3, 1.0), -5.8215176059647288478); - check_eps ("yn (3, 2.0) = -1.1277...", FUNC(yn) (3, 2.0), -1.1277837768404277861, - CHOOSE(0, 3e-16, 1.2e-7)); - check_eps ("yn (3, 10.0) = -0.25136...", FUNC(yn) (3, 10.0), -0.25136265718383732978, - CHOOSE(0, 6e-17, 3e-8)); - - /* yn (10, x) */ - check ("yn (10, +Inf) = 0", FUNC(yn) (10, plus_infty), 0); - check_isnan ("yn (10, NaN) = NaN", FUNC(yn) (10, nan_value)); - - check_eps ("yn (10, 0.1) = -1.183...*10^18", FUNC(yn) (10, 0.1), -0.11831335132045197885e19, - CHOOSE(0, 6e2, 2.8e11)); - check_eps ("yn (10, 0.7) = -4.244...*10^9", FUNC(yn) (10, 0.7), -0.42447194260703866924e10, - CHOOSE(0, 3e-6, 8e2)); - check_eps ("yn (10, 1.0) = -1.216...*10^8", FUNC(yn) (10, 1.0), -0.12161801427868918929e9, - CHOOSE(0, 2e-8, 20)); - check_eps ("yn (10, 2.0) = -129184.5...", FUNC(yn) (10, 2.0), -129184.54220803928264, - CHOOSE(0, 4.4e-11, 3e-2)); - check_eps ("yn (10, 10.0) = -0.35981...", FUNC(yn) (10, 10.0), -0.35981415218340272205, - CHOOSE(0, 1.2e-16, 3e-8)); - -} - - -/* Tests for the comparison macros */ -typedef enum { is_less, is_equal, is_greater, is_unordered } comp_result; - - -static void -comparison2_test (MATHTYPE x, MATHTYPE y, comp_result comp) -{ - char buf[255]; - int result; - int expected; - - expected = (comp == is_greater); - sprintf (buf, "isgreater (%" PRINTF_EXPR ", %" PRINTF_EXPR ") == %d", x, y, - expected); - result = (isgreater (x, y) == expected); - check_bool (buf, result); - - expected = (comp == is_greater || comp == is_equal); - sprintf (buf, "isgreaterequal (%" PRINTF_EXPR ", %" PRINTF_EXPR ") == %d", x, y, - expected); - result = (isgreaterequal (x, y) == expected); - check_bool (buf, result); - - expected = (comp == is_less); - sprintf (buf, "isless (%" PRINTF_EXPR ", %" PRINTF_EXPR ") == %d", x, y, - expected); - result = (isless (x, y) == expected); - check_bool (buf, result); - - expected = (comp == is_less || comp == is_equal); - sprintf (buf, "islessequal (%" PRINTF_EXPR ", %" PRINTF_EXPR ") == %d", x, y, - expected); - result = (islessequal (x, y) == expected); - check_bool (buf, result); - - expected = (comp == is_greater || comp == is_less); - sprintf (buf, "islessgreater (%" PRINTF_EXPR ", %" PRINTF_EXPR ") == %d", x, y, - expected); - result = (islessgreater (x, y) == expected); - check_bool (buf, result); - - expected = (comp == is_unordered); - sprintf (buf, "isunordered (%" PRINTF_EXPR ", %" PRINTF_EXPR ") == %d", x, y, - expected); - result = (isunordered (x, y) == expected); - check_bool (buf, result); -} - - -static void -comparison1_test (MATHTYPE x, MATHTYPE y, comp_result comp) -{ - comp_result comp_swap; - switch (comp) - { - case is_less: - comp_swap = is_greater; - break; - case is_greater: - comp_swap = is_less; - break; - default: - comp_swap = comp; - break; - } - comparison2_test (x, y, comp); - comparison2_test (y, x, comp_swap); -} - - -static void -comparisons_test (void) -{ - comparison1_test (1, 2, is_less); - comparison1_test (-30, 30, is_less); - comparison1_test (42, 42, is_equal); - comparison1_test (1, plus_infty, is_less); - comparison1_test (35, minus_infty, is_greater); - comparison1_test (1, nan_value, is_unordered); - comparison1_test (nan_value, nan_value, is_unordered); - comparison1_test (plus_infty, nan_value, is_unordered); - comparison1_test (minus_infty, nan_value, is_unordered); - comparison1_test (plus_infty, minus_infty, is_greater); -} - - -static void -inverse_func_pair_test (const char *test_name, - mathfunc f1, mathfunc inverse, - MATHTYPE x, MATHTYPE epsilon) -{ - MATHTYPE a, b, difference; - int result; - - a = f1 (x); - (void) &a; - b = inverse (a); - (void) &b; - - output_new_test (test_name); - result = check_equal (b, x, epsilon, &difference); - output_result (test_name, result, - b, x, difference, PRINT, PRINT); -} - - -static void -inverse_functions (void) -{ - inverse_func_pair_test ("asin(sin(x)) == x", - FUNC(sin), FUNC(asin), 1.0, - CHOOSE (2e-18L, 0, 3e-7L)); - inverse_func_pair_test ("sin(asin(x)) == x", - FUNC(asin), FUNC(sin), 1.0, 0.0); - - inverse_func_pair_test ("acos(cos(x)) == x", - FUNC(cos), FUNC(acos), 1.0, - CHOOSE (4e-18L, 1e-15L, 0)); - inverse_func_pair_test ("cos(acos(x)) == x", - FUNC(acos), FUNC(cos), 1.0, 0.0); - inverse_func_pair_test ("atan(tan(x)) == x", - FUNC(tan), FUNC(atan), 1.0, - CHOOSE (2e-18L, 0, 0)); - inverse_func_pair_test ("tan(atan(x)) == x", - FUNC(atan), FUNC(tan), 1.0, - CHOOSE (2e-18L, 1e-15L, 2e-7)); - - inverse_func_pair_test ("asinh(sinh(x)) == x", - FUNC(sinh), FUNC(asinh), 1.0, - CHOOSE (1e-18L, 0, 1e-7)); - inverse_func_pair_test ("sinh(asinh(x)) == x", - FUNC(asinh), FUNC(sinh), 1.0, - CHOOSE (2e-18L, 2e-16L, 2e-7)); - - inverse_func_pair_test ("acosh(cosh(x)) == x", - FUNC(cosh), FUNC(acosh), 1.0, - CHOOSE (1e-18L, 1e-15L, 6e-8)); - inverse_func_pair_test ("cosh(acosh(x)) == x", - FUNC(acosh), FUNC(cosh), 1.0, 0.0); - - inverse_func_pair_test ("atanh(tanh(x)) == x", - FUNC(tanh), FUNC(atanh), 1.0, - CHOOSE (1e-18L, 1e-15L, 0)); - inverse_func_pair_test ("tanh(atanh(x)) == x", - FUNC(atanh), FUNC(tanh), 1.0, 0.0); -} - - -/* Test sin and cos with the identity: sin(x)^2 + cos(x)^2 = 1. */ -static void -identities1_test (MATHTYPE x, MATHTYPE epsilon) -{ - MATHTYPE res1, res2, res3, diff; - int result; - - res1 = FUNC(sin) (x); - (void) &res1; - res2 = FUNC(cos) (x); - (void) &res2; - res3 = res1 * res1 + res2 * res2; - (void) &res3; - - output_new_test ("sin^2 + cos^2 == 1"); - result = check_equal (res3, 1.0, epsilon, &diff); - output_result_ext ("sin^2 + cos^2 == 1", result, - res3, 1.0, diff, x, PRINT, PRINT); -} - - -/* Test sin, cos, tan with the following relation: tan = sin/cos. */ -static void -identities2_test (MATHTYPE x, MATHTYPE epsilon) -{ -#ifndef TEST_INLINE - MATHTYPE res1, res2, res3, res4, diff; - int result; - - res1 = FUNC(sin) (x); - (void) &res1; - res2 = FUNC(cos) (x); - (void) &res2; - res3 = FUNC(tan) (x); - (void) &res3; - res4 = res1 / res2; - (void) &res4; - - output_new_test ("sin/cos == tan"); - result = check_equal (res4, res3, epsilon, &diff); - output_result_ext ("sin/cos == tan", result, - res4, res3, diff, x, PRINT, PRINT); -#endif -} - - -/* Test cosh and sinh with the identity cosh^2 - sinh^2 = 1. */ -static void -identities3_test (MATHTYPE x, MATHTYPE epsilon) -{ - MATHTYPE res1, res2, res3, diff; - int result; - - res1 = FUNC(sinh) (x); - (void) &res1; - res2 = FUNC(cosh) (x); - (void) &res2; - res3 = res2 * res2 - res1 * res1; - (void) &res3; - - output_new_test ("cosh^2 - sinh^2 == 1"); - result = check_equal (res3, 1.0, epsilon, &diff); - output_result_ext ("cosh^2 - sinh^2 == 1", result, - res3, 1.0, diff, x, PRINT, PRINT); -} - - -static void -identities (void) -{ - identities1_test (0.2L, CHOOSE (1e-18L, 0, 2e-7)); - identities1_test (0.9L, CHOOSE (1e-18L, 2e-16, 2e-7)); - identities1_test (0, 0); - identities1_test (-1, CHOOSE (1e-18L, 0, 1e-7)); - - identities2_test (0.2L, CHOOSE (1e-19L, 1e-16, 0)); - identities2_test (0.9L, CHOOSE (3e-19L, 1e-15, 2e-7)); - identities2_test (0, 0); - identities2_test (-1, CHOOSE (1e-18L, 1e-15, 2e-7)); - - identities3_test (0.2L, CHOOSE (1e-18L, 0, 1e-7)); - identities3_test (0.9L, CHOOSE (1e-18L, 1e-15, 1e-6)); - identities3_test (0, CHOOSE (0, 0, 1e-6)); - identities3_test (-1, CHOOSE (1e-18L, 7e-16, 1e-6)); -} - - -/* - Let's test that basic arithmetic is working - tests: Infinity and NaN - */ -static void -basic_tests (void) -{ - /* variables are declared volatile to forbid some compiler - optimizations */ - volatile MATHTYPE Inf_var, NaN_var, zero_var, one_var; - MATHTYPE x1, x2; - - zero_var = 0.0; - one_var = 1.0; - NaN_var = nan_value; - Inf_var = one_var / zero_var; - - (void) &zero_var; - (void) &one_var; - (void) &NaN_var; - (void) &Inf_var; - - /* Clear all exceptions. The previous computations raised exceptions. */ - feclearexcept (FE_ALL_EXCEPT); - - check_isinfp ("isinf (inf) == +1", Inf_var); - check_isinfn ("isinf (-inf) == -1", -Inf_var); - check_bool ("!isinf (1)", !(FUNC(isinf) (one_var))); - check_bool ("!isinf (NaN)", !(FUNC(isinf) (NaN_var))); - - check_isnan ("isnan (NaN)", NaN_var); - check_isnan ("isnan (-NaN)", -NaN_var); - check_bool ("!isnan (1)", !(FUNC(isnan) (one_var))); - check_bool ("!isnan (inf)", !(FUNC(isnan) (Inf_var))); - - check_bool ("inf == inf", Inf_var == Inf_var); - check_bool ("-inf == -inf", -Inf_var == -Inf_var); - check_bool ("inf != -inf", Inf_var != -Inf_var); - check_bool ("NaN != NaN", NaN_var != NaN_var); - - /* - the same tests but this time with NAN from - NAN is a double const - */ - check_bool ("isnan (NAN)", isnan (NAN)); - check_bool ("isnan (-NAN)", isnan (-NAN)); - check_bool ("!isinf (NAN)", !(isinf (NAN))); - check_bool ("!isinf (-NAN)", !(isinf (-NAN))); - check_bool ("NAN != NAN", NAN != NAN); - - /* - And again with the value returned by the `nan' function. - */ - check_bool ("isnan (NAN)", FUNC(isnan) (FUNC(nan) (""))); - check_bool ("isnan (-NAN)", FUNC(isnan) (-FUNC(nan) (""))); - check_bool ("!isinf (NAN)", !(FUNC(isinf) (FUNC(nan) ("")))); - check_bool ("!isinf (-NAN)", !(FUNC(isinf) (-FUNC(nan) ("")))); - check_bool ("NAN != NAN", FUNC(nan) ("") != FUNC(nan) ("")); - - /* test if EPSILON is ok */ - x1 = MATHCONST (1.0); - x2 = x1 + CHOOSE (LDBL_EPSILON, DBL_EPSILON, FLT_EPSILON); - check_bool ("1 != 1+EPSILON", x1 != x2); - - x1 = MATHCONST (1.0); - x2 = x1 - CHOOSE (LDBL_EPSILON, DBL_EPSILON, FLT_EPSILON); - check_bool ("1 != 1-EPSILON", x1 != x2); - - /* test if HUGE_VALx is ok */ - x1 = CHOOSE (HUGE_VALL, HUGE_VAL, HUGE_VALF); - check_bool ("isinf (HUGE_VALx) == +1", isinf (x1) == +1); - x1 = -CHOOSE (HUGE_VALL, HUGE_VAL, HUGE_VALF); - check_bool ("isinf (-HUGE_VALx) == -1", isinf (x1) == -1); -} - - -static void -initialize (void) -{ - fpstack_test ("start *init*"); - plus_zero = 0.0; - nan_value = plus_zero / plus_zero; /* Suppress GCC warning */ - - minus_zero = FUNC(copysign) (0.0, -1.0); - plus_infty = CHOOSE (HUGE_VALL, HUGE_VAL, HUGE_VALF); - minus_infty = CHOOSE (-HUGE_VALL, -HUGE_VAL, -HUGE_VALF); - - (void) &plus_zero; - (void) &nan_value; - (void) &minus_zero; - (void) &plus_infty; - (void) &minus_infty; - - /* Clear all exceptions. From now on we must not get random exceptions. */ - feclearexcept (FE_ALL_EXCEPT); - - /* Test to make sure we start correctly. */ - fpstack_test ("end *init*"); -} - - -static struct option long_options[] = -{ - {"verbose", optional_argument, NULL, 'v'}, - {"silent", no_argument, NULL, 's'}, - {0, 0, 0, 0} -}; - - -static void -parse_options (int argc, char *argv[]) -{ - int c; - int option_index; - - verbose = 1; - - while (1) - { - c = getopt_long (argc, argv, "v::s", - long_options, &option_index); - - /* Detect the end of the options. */ - if (c == -1) - break; - - switch (c) - { - case 'v': - if (optarg) - verbose = (unsigned int) strtoul (optarg, NULL, 0); - else - verbose = 4; - break; - case 's': - verbose = 0; - default: - break; - } - } -} - - -int -main (int argc, char *argv[]) -{ - - parse_options (argc, argv); - - initialize (); - printf (TEST_MSG); - - basic_tests (); - - /* keep the tests a wee bit ordered (according to ISO 9X) */ - /* classification functions */ - fpclassify_test (); - isfinite_test (); - isnormal_test (); - signbit_test (); - - comparisons_test (); - - /* trigonometric functions */ - acos_test (); - asin_test (); - atan_test (); - atan2_test (); - cos_test (); - sin_test (); - sincos_test (); - tan_test (); - - /* hyperbolic functions */ - acosh_test (); - asinh_test (); - atanh_test (); - cosh_test (); - sinh_test (); - tanh_test (); - - /* exponential and logarithmic functions */ - exp_test (); - exp10_test (); - exp2_test (); - expm1_test (); - frexp_test (); - ldexp_test (); - log_test (); - log10_test (); - log1p_test (); - log2_test (); - logb_test (); - modf_test (); - ilogb_test (); - scalb_test (); - scalbn_test (); - - /* power and absolute value functions */ - cbrt_test (); - fabs_test (); - hypot_test (); - pow_test (); - sqrt_test (); - - /* error and gamma functions */ - erf_test (); - erfc_test (); - gamma_test (); - tgamma_test (); - lgamma_test (); - - /* nearest integer functions */ - ceil_test (); - floor_test (); - nearbyint_test (); - rint_test (); - lrint_test (); - llrint_test (); - round_test (); - lround_test (); - llround_test (); - trunc_test (); - - /* remainder functions */ - fmod_test (); - remainder_test (); - remquo_test (); - - /* manipulation functions */ - copysign_test (); - nextafter_test (); - - /* maximum, minimum and positive difference functions */ - fdim_test (); - fmin_test (); - fmax_test (); - - /* complex functions */ - cabs_test (); - carg_test (); - cexp_test (); - csin_test (); - csinh_test (); - ccos_test (); - ccosh_test (); - clog_test (); - clog10_test (); - cacos_test (); - cacosh_test (); - casin_test (); - casinh_test (); - catan_test (); - catanh_test (); - ctan_test (); - ctanh_test (); - csqrt_test (); - cpow_test (); - - /* multiply and add */ - fma_test (); - - /* Bessel functions */ - j0_test (); - j1_test (); - jn_test (); - y0_test (); - y1_test (); - yn_test (); - - /* special tests */ - identities (); - inverse_functions (); - - printf ("\nTest suite completed:\n"); - printf (" %d test cases plus %d tests for exception flags executed.\n", - noTests, noExcTests); - if (noErrors) - { - printf (" %d errors occured.\n", noErrors); - exit (1); - } - printf (" All tests passed successfully.\n"); - exit (0); -} diff --git a/math/libm-test.inc b/math/libm-test.inc new file mode 100644 index 0000000000..74bdd0381e --- /dev/null +++ b/math/libm-test.inc @@ -0,0 +1,3950 @@ +/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger , 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 + 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. */ + +/* Part of testsuite for libm. + + This file is processed by a perl script. The resulting file has to + be included by a master file that defines: + + Makros: + FUNC(function): converts general function name (like cos) to + name with correct suffix (e.g. cosl or cosf) + MATHCONST(x): like FUNC but for constants (e.g convert 0.0 to 0.0L) + FLOAT: floating point type to test + - TEST_MSG: informal message to be displayed + CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat): + chooses one of the parameters as delta for testing + equality + PRINTF_EXPR Floating point conversion specification to print a variable + of type FLOAT with printf. PRINTF_EXPR just contains + the specifier, not the percent and width arguments, + e.g. "f". + PRINTF_XEXPR Like PRINTF_EXPR, but print in hexadecimal format. + PRINTF_NEXPR Like PRINTF_EXPR, but print nice. */ + +/* This testsuite has currently tests for: + acos, acosh, asin, asinh, atan, atan2, atanh, + cbrt, ceil, copysign, cos, cosh, erf, erfc, exp, exp10, exp2, expm1, + fabs, fdim, floor, fma, fmax, fmin, fmod, fpclassify, + frexp, gamma, hypot, + ilogb, isfinite, isinf, isnan, isnormal, + isless, islessequal, isgreater, isgreaterequal, islessgreater, isunordered, + j0, j1, jn, + ldexp, lgamma, log, log10, log1p, log2, logb, + modf, nearbyint, nextafter, + pow, remainder, remquo, rint, lrint, llrint, + round, lround, llround, + scalb, scalbn, scalbln, signbit, sin, sincos, sinh, sqrt, tan, tanh, tgamma, trunc, + y0, y1, yn + + and for the following complex math functions: + cabs, cacos, cacosh, carg, casin, casinh, catan, catanh, + ccos, ccosh, cexp, clog, cpow, cproj, csin, csinh, csqrt, ctan, ctanh. + + At the moment the following functions aren't tested: + conj, cimag, creal, drem, + significand, + nan + + Parameter handling is primitive in the moment: + --verbose=[0..3] for different levels of output: + 0: only error count + 1: basic report on failed tests (default) + 2: full report on all tests + -v for full output (equals --verbose=3) + -u for generation of an ULPs file + */ + +/* "Philosophy": + + This suite tests some aspects of the correct implementation of + mathematical functions in libm. Some simple, specific parameters + are tested for correctness but there's no exhaustive + testing. Handling of specific inputs (e.g. infinity, not-a-number) + is also tested. Correct handling of exceptions is checked + against. These implemented tests should check all cases that are + specified in ISO C 9X. + + Exception testing: At the moment only divide-by-zero and invalid + exceptions are tested. Overflow/underflow and inexact exceptions + aren't checked at the moment. + + NaN values: There exist signalling and quiet NaNs. This implementation + only uses signalling NaN as parameter but does not differenciate + between the two kinds of NaNs as result. + + Inline functions: Inlining functions should give an improvement in + speed - but not in precission. The inlined functions return + reasonable values for a reasonable range of input values. The + result is not necessarily correct for all values and exceptions are + not correctly raised in all cases. Problematic input and return + values are infinity, not-a-number and minus zero. This suite + therefore does not check these specific inputs and the exception + handling for inlined mathematical functions - just the "reasonable" + values are checked. + + Beware: The tests might fail for any of the following reasons: + - Tests are wrong + - Functions are wrong + - Floating Point Unit not working properly + - Compiler has errors + + With e.g. gcc 2.7.2.2 the test for cexp fails because of a compiler error. + */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#include "libm-test-ulps.h" +#include +#include +#include +#include + +#include +#include +#include +#include + +/* Possible exceptions */ +#define NO_EXCEPTION 0x0 +#define INVALID_EXCEPTION 0x1 +#define DIVIDE_BY_ZERO_EXCEPTION 0x2 +/* The next flags signals that those exceptions are allowed but not required. */ +#define INVALID_EXCEPTION_OK 0x4 +#define DIVIDE_BY_ZERO_EXCEPTION_OK 0x8 +#define EXCEPTIONS_OK INVALID_EXCEPTION_OK+DIVIDE_BY_ZERO_EXCEPTION_OK +/* Some special test flags, passed togther with exceptions. */ +#define IGNORE_ZERO_INF_SIGN 0x10 + +/* Various constants (we must supply them precalculated for accuracy). */ +#define M_PI_6l .52359877559829887308L +#define M_E2l 7.389056098930650227230L +#define M_E3l 20.08553692318766774093L +#define M_2_SQRT_PIl 3.5449077018110320545963L /* 2 sqrt (M_PIl) */ +#define M_SQRT_PIl 1.77245385090551602729817L /* sqrt (M_PIl) */ +#define M_LOG_SQRT_PIl 0.572364942924700087072L /* log(sqrt(M_PIl)) */ +#define M_LOG_2_SQRT_PIl 1.265512123484645396489L /* log(2*sqrt(M_PIl)) */ +#define M_PI_34l (M_PIl - M_PI_4l) /* 3*pi/4 */ +#define M_PI_34_LOG10El (M_PIl - M_PI_4l) * M_LOG10El +#define M_PI2_LOG10El M_PI_2l * M_LOG10El +#define M_PI4_LOG10El M_PI_4l * M_LOG10El +#define M_PI_LOG10El M_PIl * M_LOG10El + +static FILE *ulps_file; /* File to document difference. */ +static int output_ulps; /* Should ulps printed? */ + +static int noErrors; /* number of errors */ +static int noTests; /* number of tests (without testing exceptions) */ +static int noExcTests; /* number of tests for exception flags */ +static int noXFails; /* number of expected failures. */ +static int noXPasses; /* number of unexpected passes. */ + +static int verbose; +static int output_max_error; /* Should the maximal errors printed? */ +static int output_points; /* Should the single function results printed? */ + +static FLOAT minus_zero, plus_zero; +static FLOAT plus_infty, minus_infty, nan_value; + +static FLOAT max_error; + + +#define BUILD_COMPLEX(real, imag) \ + ({ __complex__ FLOAT __retval; \ + __real__ __retval = (real); \ + __imag__ __retval = (imag); \ + __retval; }) + + +#define MANT_DIG CHOOSE ((LDBL_MANT_DIG-1), (DBL_MANT_DIG-1), (FLT_MANT_DIG-1), \ + (LDBL_MANT_DIG-1), (DBL_MANT_DIG-1), (FLT_MANT_DIG-1)) + +static void +init_max_error (void) +{ + max_error = 0; +} + +static void +set_max_error (FLOAT current) +{ + if (current > max_error) + max_error = current; +} + + +/* Should the message print to screen? This depends on the verbose flag, + and the test status. */ +static int +print_screen (int ok, int xfail) +{ + if (output_points + && (verbose > 1 + || ((verbose == 1) && (ok == xfail)))) + return 1; + return 0; +} + + +/* Should the message print to screen? This depends on the verbose flag, + and the test status. */ +static int +print_screen_max_error (int ok, int xfail) +{ + if (output_max_error + && (verbose > 1 + || ((verbose == 1) && (ok == xfail)))) + return 1; + return 0; +} + +/* Update statistic counters. */ +static void +update_stats (int ok, int xfail) +{ + ++noTests; + if (ok && xfail) + ++noXPasses; + else if (!ok && xfail) + ++noXFails; + else if (!ok && !xfail) + ++noErrors; +} + +static void +print_ulps (const char *test_name, FLOAT ulp) +{ + if (output_ulps) + { + fprintf (ulps_file, "Test \"%s\":\n", test_name); + fprintf (ulps_file, "%s: % .4" PRINTF_NEXPR "\n", + CHOOSE("ldouble", "double", "float", + "ildouble", "idouble", "ifloat"), ulp); + } +} + +static void +print_function_ulps (const char *function_name, FLOAT ulp) +{ + if (output_ulps) + { + fprintf (ulps_file, "Function \"%s\":\n", function_name); + fprintf (ulps_file, "%s: % .4" PRINTF_NEXPR "\n", + CHOOSE("ldouble", "double", "float", + "ildouble", "idouble", "ifloat"), ulp); + } +} + + + +/* Test if Floating-Point stack hasn't changed */ +static void +fpstack_test (const char *test_name) +{ +#ifdef i386 + static int old_stack; + int sw; + + asm ("fnstsw" : "=a" (sw)); + sw >>= 11; + sw &= 7; + + if (sw != old_stack) + { + printf ("FP-Stack wrong after test %s (%d, should be %d)\n", + test_name, sw, old_stack); + ++noErrors; + old_stack = sw; + } +#endif +} + + +static void +print_max_error (const char *func_name, FLOAT allowed, int xfail) +{ + char str[500]; + int ok = 0; + + sprintf (str, "Maximal error of `%s':", func_name); + + if (max_error <= allowed) + { + ok = 1; + } + + if (!ok) + print_function_ulps (func_name, max_error); + + + if (print_screen_max_error (ok, xfail)) + { + printf ("%s\n", str); + printf (" is : % .4" PRINTF_NEXPR " ulp\n", max_error); + printf (" accepted: % .4" PRINTF_NEXPR " ulp\n", allowed); + } + + update_stats (ok, xfail); +} + + +/* Test whether a given exception was raised. */ +static void +test_single_exception (const char *test_name, + int exception, + int exc_flag, + int fe_flag, + const char *flag_name) +{ +#ifndef TEST_INLINE + int ok = 1; + if (exception & exc_flag) + { + if (fetestexcept (fe_flag)) + { + if (print_screen (1, 0)) + printf ("Pass: %s: Exception \"%s\" set\n", test_name, flag_name); + } + else + { + ok = 0; + if (print_screen (0, 0)) + printf ("Failure: %s: Exception \"%s\" not set\n", + test_name, flag_name); + } + } + else + { + if (fetestexcept (fe_flag)) + { + ok = 0; + if (print_screen (0, 0)) + printf ("Failure: %s: Exception \"%s\" set\n", + test_name, flag_name); + } + else + { + if (print_screen (1, 0)) + printf ("%s: Exception \"%s\" not set\n", test_name, + flag_name); + } + } + if (!ok) + ++noErrors; + +#endif +} + + +/* Test whether exceptions given by EXCEPTION are raised. Ignore thereby + allowed but not required exceptions. +*/ +static void +test_exceptions (const char *test_name, int exception) +{ + ++noExcTests; +#ifdef FE_DIVBYZERO + if ((exception & DIVIDE_BY_ZERO_EXCEPTION_OK) == 0) + test_single_exception (test_name, exception, + DIVIDE_BY_ZERO_EXCEPTION, FE_DIVBYZERO, + "Divide by zero"); +#endif +#ifdef FE_INVALID + if ((exception & INVALID_EXCEPTION_OK) == 0) + test_single_exception (test_name, exception, INVALID_EXCEPTION, FE_INVALID, + "Invalid operation"); +#endif + feclearexcept (FE_ALL_EXCEPT); +} + + +static void +check_float (const char *test_name, FLOAT computed, FLOAT expected, + FLOAT max_ulp, int xfail, int exceptions) +{ + int ok = 0; + int print_diff = 0; + FLOAT diff = 0; + FLOAT ulp = 0; + + test_exceptions (test_name, exceptions); + if (isnan (computed) && isnan (expected)) + ok = 1; + else if (isinf (computed) && isinf (expected)) + { + /* Test for sign of infinities. */ + if (((exceptions & IGNORE_ZERO_INF_SIGN) == 0) + && (isinf (computed) != isinf (expected))) + { + ok = 0; + printf ("infinity has wrong sign.\n"); + } + else + ok = 1; + } + /* Don't calc ulp for NaNs or infinities. */ + else if (isinf (computed) || isnan (computed) || isinf (expected) || isnan (expected)) + ok = 0; + else + { + diff = FUNC(fabs) (computed - expected); + /* ilogb (0) isn't allowed. */ + if (expected == 0.0) + ulp = diff / FUNC(ldexp) (1.0, - MANT_DIG); + else + ulp = diff / FUNC(ldexp) (1.0, FUNC(ilogb) (expected) - MANT_DIG); + set_max_error (ulp); + print_diff = 1; + if (((exceptions & IGNORE_ZERO_INF_SIGN) == 0) + && (computed == 0.0 && expected == 0.0 + && signbit(computed) != signbit (expected))) + { + ok = 0; + print_ulps (test_name, ulp); + } + else if (ulp <= max_ulp) + ok = 1; + else + { + ok = 0; + print_ulps (test_name, ulp); + } + + } + if (print_screen (ok, xfail)) + { + if (!ok) + printf ("Failure: "); + printf ("Test: %s\n", test_name); + printf ("Result:\n"); + printf (" is: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", + computed, computed); + printf (" should be: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR "\n", + expected, expected); + if (print_diff) + { + printf (" difference: % .20" PRINTF_EXPR " % .20" PRINTF_XEXPR + "\n", diff, diff); + printf (" ulp : % .4" PRINTF_NEXPR "\n", ulp); + printf (" max.ulp : % .4" PRINTF_NEXPR "\n", max_ulp); + } + } + update_stats (ok, xfail); + + fpstack_test (test_name); +} + + +static void +check_complex (const char *test_name, FLOAT __complex__ computed, + FLOAT __complex__ expected, + FLOAT max_ulp, int xfail, int exception) +{ + FLOAT part_comp, part_exp; + char str[200]; + + sprintf (str, "Real part of: %s", test_name); + part_comp = __real__ computed; + part_exp = __real__ expected; + check_float (str, part_comp, part_exp, max_ulp, xfail, exception); + + sprintf (str, "Complex part of: %s", test_name); + part_comp = __imag__ computed; + part_exp = __imag__ expected; + /* Don't check again for exceptions, just pass through the + zero/inf sign test. */ + check_float (str, part_comp, part_exp, max_ulp, xfail, + exception & IGNORE_ZERO_INF_SIGN); +} + + +/* Check that computed and expected values are equal (int values). */ +static void +check_int (const char *test_name, int computed, int expected, int max_ulp, + int xfail, int exceptions) +{ + int diff = computed - expected; + int ok = 0; + + test_exceptions (test_name, exceptions); + noTests++; + if (abs (diff) <= max_ulp) + ok = 1; + + if (!ok) + print_ulps (test_name, diff); + + if (print_screen (ok, xfail)) + { + if (!ok) + printf ("Failure: "); + printf ("Test: %s\n", test_name); + printf ("Result:\n"); + printf (" is: %d\n", computed); + printf (" should be: %d\n", expected); + } + + update_stats (ok, xfail); + fpstack_test (test_name); +} + + +/* Check that computed and expected values are equal (long int values). */ +static void +check_long (const char *test_name, long int computed, long int expected, + long int max_ulp, int xfail, int exceptions) +{ + long int diff = computed - expected; + int ok = 0; + + test_exceptions (test_name, exceptions); + noTests++; + if (labs (diff) <= max_ulp) + ok = 1; + + if (!ok) + print_ulps (test_name, diff); + + if (print_screen (ok, xfail)) + { + if (!ok) + printf ("Failure: "); + printf ("Test: %s\n", test_name); + printf ("Result:\n"); + printf (" is: %ld\n", computed); + printf (" should be: %ld\n", expected); + } + + update_stats (ok, xfail); + fpstack_test (test_name); +} + + +/* Check that computed value is true/false. */ +static void +check_bool (const char *test_name, int computed, int expected, + long int max_ulp, int xfail, int exceptions) +{ + int ok = 0; + + test_exceptions (test_name, exceptions); + noTests++; + if ((computed == 0) == (expected == 0)) + ok = 1; + + if (print_screen (ok, xfail)) + { + if (!ok) + printf ("Failure: "); + printf ("Test: %s\n", test_name); + printf ("Result:\n"); + printf (" is: %d\n", computed); + printf (" should be: %d\n", expected); + } + + update_stats (ok, xfail); + fpstack_test (test_name); +} + + +/* check that computed and expected values are equal (long int values) */ +static void +check_longlong (const char *test_name, long long int computed, + long long int expected, + long long int max_ulp, int xfail, + int exceptions) +{ + long long int diff = computed - expected; + int ok = 0; + + test_exceptions (test_name, exceptions); + noTests++; + if (llabs (diff) <= max_ulp) + ok = 1; + + if (!ok) + print_ulps (test_name, diff); + + if (print_screen (ok, xfail)) + { + if (!ok) + printf ("Failure:"); + printf ("Test: %s\n", test_name); + printf ("Result:\n"); + printf (" is: %lld\n", computed); + printf (" should be: %lld\n", expected); + } + + update_stats (ok, xfail); + fpstack_test (test_name); +} + + + +/* This is to prevent messages from the SVID libm emulation. */ +int +matherr (struct exception *x __attribute__ ((unused))) +{ + return 1; +} + + +/**************************************************************************** + Tests for single functions of libm. + Please keep them alphabetically sorted! +****************************************************************************/ + +static void +acos_test (void) +{ + START (acos); + + TEST_f_f (acos, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_f_f (acos, minus_infty, nan_value, INVALID_EXCEPTION); + TEST_f_f (acos, nan_value, nan_value); + + /* |x| > 1: */ + TEST_f_f (acos, 1.1, nan_value, INVALID_EXCEPTION); + TEST_f_f (acos, -1.1, nan_value, INVALID_EXCEPTION); + + TEST_f_f (acos, 0, M_PI_2l); + TEST_f_f (acos, minus_zero, M_PI_2l); + TEST_f_f (acos, 1, 0); + TEST_f_f (acos, -1, M_PIl); + TEST_f_f (acos, 0.5, M_PI_6l*2.0); + TEST_f_f (acos, -0.5, M_PI_6l*4.0); + TEST_f_f (acos, 0.7, 0.7953988301841435554L); + + END (acos); +} + +static void +acosh_test (void) +{ + START (acosh); + + TEST_f_f (acosh, plus_infty, plus_infty); + TEST_f_f (acosh, minus_infty, nan_value, INVALID_EXCEPTION); + + /* x < 1: */ + TEST_f_f (acosh, -1.1, nan_value, INVALID_EXCEPTION); + + TEST_f_f (acosh, 1, 0); + TEST_f_f (acosh, 7, 2.6339157938496334172L); + + END (acosh); +} + +static void +asin_test (void) +{ + + START (asin); + + TEST_f_f (asin, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_f_f (asin, minus_infty, nan_value, INVALID_EXCEPTION); + TEST_f_f (asin, nan_value, nan_value); + + /* asin x == NaN plus invalid exception for |x| > 1. */ + TEST_f_f (asin, 1.1, nan_value, INVALID_EXCEPTION); + TEST_f_f (asin, -1.1, nan_value, INVALID_EXCEPTION); + + TEST_f_f (asin, 0, 0); + TEST_f_f (asin, minus_zero, minus_zero); + TEST_f_f (asin, 0.5, M_PI_6l); + TEST_f_f (asin, -0.5, -M_PI_6l); + TEST_f_f (asin, 1.0, M_PI_2l); + TEST_f_f (asin, -1.0, -M_PI_2l); + TEST_f_f (asin, 0.7, 0.7753974966107530637L); + + END (asin); +} + +static void +asinh_test (void) +{ + START (asinh); + + TEST_f_f (asinh, 0, 0); + TEST_f_f (asinh, minus_zero, minus_zero); + TEST_f_f (asinh, plus_infty, plus_infty); + TEST_f_f (asinh, minus_infty, minus_infty); + TEST_f_f (asinh, 0.7, 0.652666566082355786L); + + END (asinh); +} + +static void +atan_test (void) +{ + + START (atan); + + TEST_f_f (atan, 0, 0); + TEST_f_f (atan, minus_zero, minus_zero); + + TEST_f_f (atan, plus_infty, M_PI_2l); + TEST_f_f (atan, minus_infty, -M_PI_2l); + + TEST_f_f (atan, 1, M_PI_4l); + TEST_f_f (atan, -1, -M_PI_4l); + + TEST_f_f (atan, 0.7, 0.6107259643892086165L); + + END (atan); +} + + + +static void +atanh_test (void) +{ + + START (atanh); + + + TEST_f_f (atanh, 0, 0); + TEST_f_f (atanh, minus_zero, minus_zero); + + TEST_f_f (atanh, 1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_f_f (atanh, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + + /* atanh (x) == NaN plus invalid exception if |x| > 1. */ + TEST_f_f (atanh, 1.1, nan_value, INVALID_EXCEPTION); + TEST_f_f (atanh, -1.1, nan_value, INVALID_EXCEPTION); + + TEST_f_f (atanh, 0.7, 0.8673005276940531944L); + + END (atanh); +} + +static void +atan2_test (void) +{ + START (atan2); + + /* atan2 (0,x) == 0 for x > 0. */ + TEST_ff_f (atan2, 0, 1, 0); + + /* atan2 (-0,x) == -0 for x > 0. */ + TEST_ff_f (atan2, minus_zero, 1, minus_zero); + + TEST_ff_f (atan2, 0, 0, 0); + TEST_ff_f (atan2, minus_zero, 0, minus_zero); + + /* atan2 (+0,x) == +pi for x < 0. */ + TEST_ff_f (atan2, 0, -1, M_PIl); + + /* atan2 (-0,x) == -pi for x < 0. */ + TEST_ff_f (atan2, minus_zero, -1, -M_PIl); + + TEST_ff_f (atan2, 0, minus_zero, M_PIl); + TEST_ff_f (atan2, minus_zero, minus_zero, -M_PIl); + + /* atan2 (y,+0) == pi/2 for y > 0. */ + TEST_ff_f (atan2, 1, 0, M_PI_2l); + + /* atan2 (y,-0) == pi/2 for y > 0. */ + TEST_ff_f (atan2, 1, minus_zero, M_PI_2l); + + /* atan2 (y,+0) == -pi/2 for y < 0. */ + TEST_ff_f (atan2, -1, 0, -M_PI_2l); + + /* atan2 (y,-0) == -pi/2 for y < 0. */ + TEST_ff_f (atan2, -1, minus_zero, -M_PI_2l); + + /* atan2 (y,inf) == +0 for finite y > 0. */ + TEST_ff_f (atan2, 1, plus_infty, 0); + + /* atan2 (y,inf) == -0 for finite y < 0. */ + TEST_ff_f (atan2, -1, plus_infty, minus_zero); + + /* atan2(+inf, x) == pi/2 for finite x. */ + TEST_ff_f (atan2, plus_infty, -1, M_PI_2l); + + /* atan2(-inf, x) == -pi/2 for finite x. */ + TEST_ff_f (atan2, minus_infty, 1, -M_PI_2l); + + /* atan2 (y,-inf) == +pi for finite y > 0. */ + TEST_ff_f (atan2, 1, minus_infty, M_PIl); + + /* atan2 (y,-inf) == -pi for finite y < 0. */ + TEST_ff_f (atan2, -1, minus_infty, -M_PIl); + + TEST_ff_f (atan2, plus_infty, plus_infty, M_PI_4l); + TEST_ff_f (atan2, minus_infty, plus_infty, -M_PI_4l); + TEST_ff_f (atan2, plus_infty, minus_infty, M_PI_34l); + TEST_ff_f (atan2, minus_infty, minus_infty, -M_PI_34l); + + TEST_ff_f (atan2, 0.7, 1, 0.6107259643892086165L); + TEST_ff_f (atan2, 0.4, 0.0003, 1.5700463269355215718L); + + END (atan2); +} + + +static void +cabs_test (void) +{ + START (cabs); + + /* cabs (x + iy) is specified as hypot (x,y) */ + + /* cabs (+inf + i x) == +inf. */ + TEST_c_f (cabs, plus_infty, 1.0, plus_infty); + /* cabs (-inf + i x) == +inf. */ + TEST_c_f (cabs, minus_infty, 1.0, plus_infty); + + TEST_c_f (cabs, minus_infty, nan_value, plus_infty); + TEST_c_f (cabs, minus_infty, nan_value, plus_infty); + + TEST_c_f (cabs, nan_value, nan_value, nan_value); + + /* cabs (x,y) == cabs (y,x). */ + TEST_c_f (cabs, 0.7L, 12.4L, 12.41974234837422060118L); + /* cabs (x,y) == cabs (-x,y). */ + TEST_c_f (cabs, -12.4L, 0.7L, 12.41974234837422060118L); + /* cabs (x,y) == cabs (-y,x). */ + TEST_c_f (cabs, -0.7L, 12.4L, 12.41974234837422060118L); + /* cabs (x,y) == cabs (-x,-y). */ + TEST_c_f (cabs, -12.4L, -0.7L, 12.41974234837422060118L); + /* cabs (x,y) == cabs (-y,-x). */ + TEST_c_f (cabs, -0.7L, -12.4L, 12.41974234837422060118L); + /* cabs (x,0) == fabs (x). */ + TEST_c_f (cabs, -0.7L, 0, 0.7L); + TEST_c_f (cabs, 0.7L, 0, 0.7L); + TEST_c_f (cabs, -1.0L, 0, 1.0L); + TEST_c_f (cabs, 1.0L, 0, 1.0L); + TEST_c_f (cabs, -5.7e7L, 0, 5.7e7L); + TEST_c_f (cabs, 5.7e7L, 0, 5.7e7L); + + TEST_c_f (cabs, 0.7, 1.2, 1.3892443989449804508L); + + END (cabs); +} + +static void +cacos_test (void) +{ + START (cacos); + + + TEST_c_c (cacos, 0, 0, M_PI_2l, minus_zero); + TEST_c_c (cacos, minus_zero, 0, M_PI_2l, minus_zero); + TEST_c_c (cacos, minus_zero, minus_zero, M_PI_2l, 0.0); + TEST_c_c (cacos, 0, minus_zero, M_PI_2l, 0.0); + + TEST_c_c (cacos, minus_infty, plus_infty, M_PI_34l, minus_infty); + TEST_c_c (cacos, minus_infty, minus_infty, M_PI_34l, plus_infty); + + TEST_c_c (cacos, plus_infty, plus_infty, M_PI_4l, minus_infty); + TEST_c_c (cacos, plus_infty, minus_infty, M_PI_4l, plus_infty); + + TEST_c_c (cacos, -10.0, plus_infty, M_PI_2l, minus_infty); + TEST_c_c (cacos, -10.0, minus_infty, M_PI_2l, plus_infty); + TEST_c_c (cacos, 0, plus_infty, M_PI_2l, minus_infty); + TEST_c_c (cacos, 0, minus_infty, M_PI_2l, plus_infty); + TEST_c_c (cacos, 0.1, plus_infty, M_PI_2l, minus_infty); + TEST_c_c (cacos, 0.1, minus_infty, M_PI_2l, plus_infty); + + TEST_c_c (cacos, minus_infty, 0, M_PIl, minus_infty); + TEST_c_c (cacos, minus_infty, minus_zero, M_PIl, plus_infty); + TEST_c_c (cacos, minus_infty, 100, M_PIl, minus_infty); + TEST_c_c (cacos, minus_infty, -100, M_PIl, plus_infty); + + TEST_c_c (cacos, plus_infty, 0, 0.0, minus_infty); + TEST_c_c (cacos, plus_infty, minus_zero, 0.0, plus_infty); + TEST_c_c (cacos, plus_infty, 0.5, 0.0, minus_infty); + TEST_c_c (cacos, plus_infty, -0.5, 0.0, plus_infty); + + TEST_c_c (cacos, plus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN); + TEST_c_c (cacos, minus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (cacos, 0, nan_value, M_PI_2l, nan_value); + TEST_c_c (cacos, minus_zero, nan_value, M_PI_2l, nan_value); + + TEST_c_c (cacos, nan_value, plus_infty, nan_value, minus_infty); + TEST_c_c (cacos, nan_value, minus_infty, nan_value, plus_infty); + + TEST_c_c (cacos, 10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (cacos, -10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (cacos, nan_value, 0.75, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (cacos, nan_value, -0.75, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (cacos, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (cacos, 0.7, 1.2, 1.1351827477151551089L, -1.0927647857577371459L); + TEST_c_c (cacos, -2, -3, 2.1414491111159960199L, 1.9833870299165354323L); + + END (cacos); +} + + +static void +cacosh_test (void) +{ + START (cacosh); + + + TEST_c_c (cacosh, 0, 0, 0.0, M_PI_2l); + TEST_c_c (cacosh, minus_zero, 0, 0.0, M_PI_2l); + TEST_c_c (cacosh, 0, minus_zero, 0.0, -M_PI_2l); + TEST_c_c (cacosh, minus_zero, minus_zero, 0.0, -M_PI_2l); + TEST_c_c (cacosh, minus_infty, plus_infty, plus_infty, M_PI_34l); + TEST_c_c (cacosh, minus_infty, minus_infty, plus_infty, -M_PI_34l); + + TEST_c_c (cacosh, plus_infty, plus_infty, plus_infty, M_PI_4l); + TEST_c_c (cacosh, plus_infty, minus_infty, plus_infty, -M_PI_4l); + + TEST_c_c (cacosh, -10.0, plus_infty, plus_infty, M_PI_2l); + TEST_c_c (cacosh, -10.0, minus_infty, plus_infty, -M_PI_2l); + TEST_c_c (cacosh, 0, plus_infty, plus_infty, M_PI_2l); + TEST_c_c (cacosh, 0, minus_infty, plus_infty, -M_PI_2l); + TEST_c_c (cacosh, 0.1, plus_infty, plus_infty, M_PI_2l); + TEST_c_c (cacosh, 0.1, minus_infty, plus_infty, -M_PI_2l); + + TEST_c_c (cacosh, minus_infty, 0, plus_infty, M_PIl); + TEST_c_c (cacosh, minus_infty, minus_zero, plus_infty, -M_PIl); + TEST_c_c (cacosh, minus_infty, 100, plus_infty, M_PIl); + TEST_c_c (cacosh, minus_infty, -100, plus_infty, -M_PIl); + + TEST_c_c (cacosh, plus_infty, 0, plus_infty, 0.0); + TEST_c_c (cacosh, plus_infty, minus_zero, plus_infty, minus_zero); + TEST_c_c (cacosh, plus_infty, 0.5, plus_infty, 0.0); + TEST_c_c (cacosh, plus_infty, -0.5, plus_infty, minus_zero); + + TEST_c_c (cacosh, plus_infty, nan_value, plus_infty, nan_value); + TEST_c_c (cacosh, minus_infty, nan_value, plus_infty, nan_value); + + TEST_c_c (cacosh, 0, nan_value, nan_value, nan_value); + TEST_c_c (cacosh, minus_zero, nan_value, nan_value, nan_value); + + TEST_c_c (cacosh, nan_value, plus_infty, plus_infty, nan_value); + TEST_c_c (cacosh, nan_value, minus_infty, plus_infty, nan_value); + + TEST_c_c (cacosh, 10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (cacosh, -10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (cacosh, nan_value, 0.75, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (cacosh, nan_value, -0.75, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (cacosh, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (cacosh, 0.7, 1.2, 1.0927647857577371459L, 1.1351827477151551089L); + TEST_c_c (cacosh, -2, -3, -1.9833870299165354323L, 2.1414491111159960199L); + + END (cacosh); +} + +static void +carg_test (void) +{ + START (carg); + + /* carg (x + iy) is specified as atan2 (y, x) */ + + /* carg (x + i 0) == 0 for x > 0. */ + TEST_c_f (carg, 2.0, 0, 0); + /* carg (x - i 0) == -0 for x > 0. */ + TEST_c_f (carg, 2.0, minus_zero, minus_zero); + + TEST_c_f (carg, 0, 0, 0); + TEST_c_f (carg, 0, minus_zero, minus_zero); + + /* carg (x + i 0) == +pi for x < 0. */ + TEST_c_f (carg, -2.0, 0, M_PIl); + + /* carg (x - i 0) == -pi for x < 0. */ + TEST_c_f (carg, -2.0, minus_zero, -M_PIl); + + TEST_c_f (carg, minus_zero, 0, M_PIl); + TEST_c_f (carg, minus_zero, minus_zero, -M_PIl); + + /* carg (+0 + i y) == pi/2 for y > 0. */ + TEST_c_f (carg, 0, 2.0, M_PI_2l); + + /* carg (-0 + i y) == pi/2 for y > 0. */ + TEST_c_f (carg, minus_zero, 2.0, M_PI_2l); + + /* carg (+0 + i y) == -pi/2 for y < 0. */ + TEST_c_f (carg, 0, -2.0, -M_PI_2l); + + /* carg (-0 + i y) == -pi/2 for y < 0. */ + TEST_c_f (carg, minus_zero, -2.0, -M_PI_2l); + + /* carg (inf + i y) == +0 for finite y > 0. */ + TEST_c_f (carg, plus_infty, 2.0, 0); + + /* carg (inf + i y) == -0 for finite y < 0. */ + TEST_c_f (carg, plus_infty, -2.0, minus_zero); + + /* carg(x + i inf) == pi/2 for finite x. */ + TEST_c_f (carg, 10.0, plus_infty, M_PI_2l); + + /* carg(x - i inf) == -pi/2 for finite x. */ + TEST_c_f (carg, 10.0, minus_infty, -M_PI_2l); + + /* carg (-inf + i y) == +pi for finite y > 0. */ + TEST_c_f (carg, minus_infty, 10.0, M_PIl); + + /* carg (-inf + i y) == -pi for finite y < 0. */ + TEST_c_f (carg, minus_infty, -10.0, -M_PIl); + + TEST_c_f (carg, plus_infty, plus_infty, M_PI_4l); + + TEST_c_f (carg, plus_infty, minus_infty, -M_PI_4l); + + TEST_c_f (carg, minus_infty, plus_infty, 3 * M_PI_4l); + + TEST_c_f (carg, minus_infty, minus_infty, -3 * M_PI_4l); + + END (carg); +} + +static void +casin_test (void) +{ + START (casin); + + TEST_c_c (casin, 0, 0, 0.0, 0.0); + TEST_c_c (casin, minus_zero, 0, minus_zero, 0.0); + TEST_c_c (casin, 0, minus_zero, 0.0, minus_zero); + TEST_c_c (casin, minus_zero, minus_zero, minus_zero, minus_zero); + + TEST_c_c (casin, plus_infty, plus_infty, M_PI_4l, plus_infty); + TEST_c_c (casin, plus_infty, minus_infty, M_PI_4l, minus_infty); + TEST_c_c (casin, minus_infty, plus_infty, -M_PI_4l, plus_infty); + TEST_c_c (casin, minus_infty, minus_infty, -M_PI_4l, minus_infty); + + TEST_c_c (casin, -10.0, plus_infty, minus_zero, plus_infty); + TEST_c_c (casin, -10.0, minus_infty, minus_zero, minus_infty); + TEST_c_c (casin, 0, plus_infty, 0.0, plus_infty); + TEST_c_c (casin, 0, minus_infty, 0.0, minus_infty); + TEST_c_c (casin, minus_zero, plus_infty, minus_zero, plus_infty); + TEST_c_c (casin, minus_zero, minus_infty, minus_zero, minus_infty); + TEST_c_c (casin, 0.1, plus_infty, 0.0, plus_infty); + TEST_c_c (casin, 0.1, minus_infty, 0.0, minus_infty); + + TEST_c_c (casin, minus_infty, 0, -M_PI_2l, plus_infty); + TEST_c_c (casin, minus_infty, minus_zero, -M_PI_2l, minus_infty); + TEST_c_c (casin, minus_infty, 100, -M_PI_2l, plus_infty); + TEST_c_c (casin, minus_infty, -100, -M_PI_2l, minus_infty); + + TEST_c_c (casin, plus_infty, 0, M_PI_2l, plus_infty); + TEST_c_c (casin, plus_infty, minus_zero, M_PI_2l, minus_infty); + TEST_c_c (casin, plus_infty, 0.5, M_PI_2l, plus_infty); + TEST_c_c (casin, plus_infty, -0.5, M_PI_2l, minus_infty); + + TEST_c_c (casin, nan_value, plus_infty, nan_value, plus_infty); + TEST_c_c (casin, nan_value, minus_infty, nan_value, minus_infty); + + TEST_c_c (casin, 0.0, nan_value, 0.0, nan_value); + TEST_c_c (casin, minus_zero, nan_value, minus_zero, nan_value); + + TEST_c_c (casin, plus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN); + TEST_c_c (casin, minus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (casin, nan_value, 10.5, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (casin, nan_value, -10.5, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (casin, 0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (casin, -0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (casin, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (casin, 0.7, 1.2, 0.4356135790797415103L, 1.0927647857577371459L); + TEST_c_c (casin, -2, -3, -0.5706527843210994007L, -1.9833870299165354323L); + + END (casin); +} + + +static void +casinh_test (void) +{ + START (casinh); + + TEST_c_c (casinh, 0, 0, 0.0, 0.0); + TEST_c_c (casinh, minus_zero, 0, minus_zero, 0); + TEST_c_c (casinh, 0, minus_zero, 0.0, minus_zero); + TEST_c_c (casinh, minus_zero, minus_zero, minus_zero, minus_zero); + + TEST_c_c (casinh, plus_infty, plus_infty, plus_infty, M_PI_4l); + TEST_c_c (casinh, plus_infty, minus_infty, plus_infty, -M_PI_4l); + TEST_c_c (casinh, minus_infty, plus_infty, minus_infty, M_PI_4l); + TEST_c_c (casinh, minus_infty, minus_infty, minus_infty, -M_PI_4l); + + TEST_c_c (casinh, -10.0, plus_infty, minus_infty, M_PI_2l); + TEST_c_c (casinh, -10.0, minus_infty, minus_infty, -M_PI_2l); + TEST_c_c (casinh, 0, plus_infty, plus_infty, M_PI_2l); + TEST_c_c (casinh, 0, minus_infty, plus_infty, -M_PI_2l); + TEST_c_c (casinh, minus_zero, plus_infty, minus_infty, M_PI_2l); + TEST_c_c (casinh, minus_zero, minus_infty, minus_infty, -M_PI_2l); + TEST_c_c (casinh, 0.1, plus_infty, plus_infty, M_PI_2l); + TEST_c_c (casinh, 0.1, minus_infty, plus_infty, -M_PI_2l); + + TEST_c_c (casinh, minus_infty, 0, minus_infty, 0.0); + TEST_c_c (casinh, minus_infty, minus_zero, minus_infty, minus_zero); + TEST_c_c (casinh, minus_infty, 100, minus_infty, 0.0); + TEST_c_c (casinh, minus_infty, -100, minus_infty, minus_zero); + + TEST_c_c (casinh, plus_infty, 0, plus_infty, 0.0); + TEST_c_c (casinh, plus_infty, minus_zero, plus_infty, minus_zero); + TEST_c_c (casinh, plus_infty, 0.5, plus_infty, 0.0); + TEST_c_c (casinh, plus_infty, -0.5, plus_infty, minus_zero); + + TEST_c_c (casinh, plus_infty, nan_value, plus_infty, nan_value); + TEST_c_c (casinh, minus_infty, nan_value, minus_infty, nan_value); + + TEST_c_c (casinh, nan_value, 0, nan_value, 0.0); + TEST_c_c (casinh, nan_value, minus_zero, nan_value, minus_zero); + + TEST_c_c (casinh, nan_value, plus_infty, plus_infty, nan_value, IGNORE_ZERO_INF_SIGN); + TEST_c_c (casinh, nan_value, minus_infty, plus_infty, nan_value, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (casinh, 10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (casinh, -10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (casinh, nan_value, 0.75, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (casinh, -0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (casinh, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (casinh, 0.7, 1.2, 0.9786545955936738768L, 0.9113541895315601156L); + TEST_c_c (casinh, -2, -3, -1.9686379257930962917L, -0.9646585044076027920L); + + END (casinh); +} + + +static void +catan_test (void) +{ + START (catan); + + TEST_c_c (catan, 0, 0, 0, 0); + TEST_c_c (catan, minus_zero, 0, minus_zero, 0); + TEST_c_c (catan, 0, minus_zero, 0, minus_zero); + TEST_c_c (catan, minus_zero, minus_zero, minus_zero, minus_zero); + + TEST_c_c (catan, plus_infty, plus_infty, M_PI_2l, 0); + TEST_c_c (catan, plus_infty, minus_infty, M_PI_2l, minus_zero); + TEST_c_c (catan, minus_infty, plus_infty, -M_PI_2l, 0); + TEST_c_c (catan, minus_infty, minus_infty, -M_PI_2l, minus_zero); + + + TEST_c_c (catan, plus_infty, -10.0, M_PI_2l, minus_zero); + TEST_c_c (catan, minus_infty, -10.0, -M_PI_2l, minus_zero); + TEST_c_c (catan, plus_infty, minus_zero, M_PI_2l, minus_zero); + TEST_c_c (catan, minus_infty, minus_zero, -M_PI_2l, minus_zero); + TEST_c_c (catan, plus_infty, 0.0, M_PI_2l, 0); + TEST_c_c (catan, minus_infty, 0.0, -M_PI_2l, 0); + TEST_c_c (catan, plus_infty, 0.1, M_PI_2l, 0); + TEST_c_c (catan, minus_infty, 0.1, -M_PI_2l, 0); + + TEST_c_c (catan, 0.0, minus_infty, M_PI_2l, minus_zero); + TEST_c_c (catan, minus_zero, minus_infty, -M_PI_2l, minus_zero); + TEST_c_c (catan, 100.0, minus_infty, M_PI_2l, minus_zero); + TEST_c_c (catan, -100.0, minus_infty, -M_PI_2l, minus_zero); + + TEST_c_c (catan, 0.0, plus_infty, M_PI_2l, 0); + TEST_c_c (catan, minus_zero, plus_infty, -M_PI_2l, 0); + TEST_c_c (catan, 0.5, plus_infty, M_PI_2l, 0); + TEST_c_c (catan, -0.5, plus_infty, -M_PI_2l, 0); + + TEST_c_c (catan, nan_value, 0.0, nan_value, 0); + TEST_c_c (catan, nan_value, minus_zero, nan_value, minus_zero); + + TEST_c_c (catan, nan_value, plus_infty, nan_value, 0); + TEST_c_c (catan, nan_value, minus_infty, nan_value, minus_zero); + + TEST_c_c (catan, 0.0, nan_value, nan_value, nan_value); + TEST_c_c (catan, minus_zero, nan_value, nan_value, nan_value); + + TEST_c_c (catan, plus_infty, nan_value, M_PI_2l, 0, IGNORE_ZERO_INF_SIGN); + TEST_c_c (catan, minus_infty, nan_value, -M_PI_2l, 0, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (catan, nan_value, 10.5, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (catan, nan_value, -10.5, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (catan, 0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (catan, -0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (catan, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (catan, 0.7, 1.2, 1.0785743834118921877L, 0.5770573776534306764L); + + TEST_c_c (catan, -2, -3, -1.4099210495965755225L, -0.2290726829685387662L); + + END (catan); +} + +static void +catanh_test (void) +{ + START (catanh); + + TEST_c_c (catanh, 0, 0, 0.0, 0.0); + TEST_c_c (catanh, minus_zero, 0, minus_zero, 0.0); + TEST_c_c (catanh, 0, minus_zero, 0.0, minus_zero); + TEST_c_c (catanh, minus_zero, minus_zero, minus_zero, minus_zero); + + TEST_c_c (catanh, plus_infty, plus_infty, 0.0, M_PI_2l); + TEST_c_c (catanh, plus_infty, minus_infty, 0.0, -M_PI_2l); + TEST_c_c (catanh, minus_infty, plus_infty, minus_zero, M_PI_2l); + TEST_c_c (catanh, minus_infty, minus_infty, minus_zero, -M_PI_2l); + + TEST_c_c (catanh, -10.0, plus_infty, minus_zero, M_PI_2l); + TEST_c_c (catanh, -10.0, minus_infty, minus_zero, -M_PI_2l); + TEST_c_c (catanh, minus_zero, plus_infty, minus_zero, M_PI_2l); + TEST_c_c (catanh, minus_zero, minus_infty, minus_zero, -M_PI_2l); + TEST_c_c (catanh, 0, plus_infty, 0.0, M_PI_2l); + TEST_c_c (catanh, 0, minus_infty, 0.0, -M_PI_2l); + TEST_c_c (catanh, 0.1, plus_infty, 0.0, M_PI_2l); + TEST_c_c (catanh, 0.1, minus_infty, 0.0, -M_PI_2l); + + TEST_c_c (catanh, minus_infty, 0, minus_zero, M_PI_2l); + TEST_c_c (catanh, minus_infty, minus_zero, minus_zero, -M_PI_2l); + TEST_c_c (catanh, minus_infty, 100, minus_zero, M_PI_2l); + TEST_c_c (catanh, minus_infty, -100, minus_zero, -M_PI_2l); + + TEST_c_c (catanh, plus_infty, 0, 0.0, M_PI_2l); + TEST_c_c (catanh, plus_infty, minus_zero, 0.0, -M_PI_2l); + TEST_c_c (catanh, plus_infty, 0.5, 0.0, M_PI_2l); + TEST_c_c (catanh, plus_infty, -0.5, 0.0, -M_PI_2l); + + TEST_c_c (catanh, 0, nan_value, 0.0, nan_value); + TEST_c_c (catanh, minus_zero, nan_value, minus_zero, nan_value); + + TEST_c_c (catanh, plus_infty, nan_value, 0.0, nan_value); + TEST_c_c (catanh, minus_infty, nan_value, minus_zero, nan_value); + + TEST_c_c (catanh, nan_value, 0, nan_value, nan_value); + TEST_c_c (catanh, nan_value, minus_zero, nan_value, nan_value); + + TEST_c_c (catanh, nan_value, plus_infty, 0.0, M_PI_2l, IGNORE_ZERO_INF_SIGN); + TEST_c_c (catanh, nan_value, minus_infty, 0.0, -M_PI_2l, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (catanh, 10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (catanh, -10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (catanh, nan_value, 0.75, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (catanh, nan_value, -0.75, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (catanh, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (catanh, 0.7, 1.2, 0.2600749516525135959L, 0.9702403077950989849L); + TEST_c_c (catanh, -2, -3, -0.1469466662255297520L, -1.3389725222944935611L); + + END (catanh); +} + +static void +cbrt_test (void) +{ + START (cbrt); + + TEST_f_f (cbrt, 0.0, 0.0); + TEST_f_f (cbrt, minus_zero, minus_zero); + + TEST_f_f (cbrt, plus_infty, plus_infty); + TEST_f_f (cbrt, minus_infty, minus_infty); + TEST_f_f (cbrt, nan_value, nan_value); + + TEST_f_f (cbrt, -0.001, -0.1); + TEST_f_f (cbrt, 8, 2); + TEST_f_f (cbrt, -27.0, -3.0); + TEST_f_f (cbrt, 0.970299, 0.99); + TEST_f_f (cbrt, 0.7, 0.8879040017426007084L); + + END (cbrt); +} + +static void +ccos_test (void) +{ + + START (ccos); + + TEST_c_c (ccos, 0.0, 0.0, 1.0, minus_zero); + TEST_c_c (ccos, minus_zero, 0.0, 1.0, 0.0); + TEST_c_c (ccos, 0.0, minus_zero, 1.0, 0.0); + TEST_c_c (ccos, minus_zero, minus_zero, 1.0, minus_zero); + + TEST_c_c (ccos, plus_infty, 0.0, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccos, plus_infty, minus_zero, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccos, minus_infty, 0.0, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccos, minus_infty, minus_zero, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + + TEST_c_c (ccos, 0.0, plus_infty, plus_infty, minus_zero); + TEST_c_c (ccos, 0.0, minus_infty, plus_infty, 0.0); + TEST_c_c (ccos, minus_zero, plus_infty, plus_infty, 0.0); + TEST_c_c (ccos, minus_zero, minus_infty, plus_infty, minus_zero); + + TEST_c_c (ccos, plus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccos, minus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccos, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccos, minus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + + TEST_c_c (ccos, 4.625, plus_infty, minus_infty, plus_infty); + TEST_c_c (ccos, 4.625, minus_infty, minus_infty, minus_infty); + TEST_c_c (ccos, -4.625, plus_infty, minus_infty, minus_infty); + TEST_c_c (ccos, -4.625, minus_infty, minus_infty, plus_infty); + + TEST_c_c (ccos, plus_infty, 6.75, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccos, plus_infty, -6.75, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccos, minus_infty, 6.75, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccos, minus_infty, -6.75, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (ccos, nan_value, 0.0, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccos, nan_value, minus_zero, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (ccos, nan_value, plus_infty, plus_infty, nan_value); + TEST_c_c (ccos, nan_value, minus_infty, plus_infty, nan_value); + + TEST_c_c (ccos, nan_value, 9.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ccos, nan_value, -9.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ccos, 0.0, nan_value, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccos, minus_zero, nan_value, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (ccos, 10.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ccos, -10.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ccos, plus_infty, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ccos, minus_infty, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ccos, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (ccos, 0.7, 1.2, 1.3848657645312111080L, -0.97242170335830028619L); + + TEST_c_c (ccos, -2, -3, -4.1896256909688072301L, -9.1092278937553365979L); + + END (ccos); +} + + +static void +ccosh_test (void) +{ + + START (ccosh); + + TEST_c_c (ccosh, 0.0, 0.0, 1.0, 0.0); + TEST_c_c (ccosh, minus_zero, 0.0, 1.0, minus_zero); + TEST_c_c (ccosh, 0.0, minus_zero, 1.0, minus_zero); + TEST_c_c (ccosh, minus_zero, minus_zero, 1.0, 0.0); + + TEST_c_c (ccosh, 0.0, plus_infty, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccosh, minus_zero, plus_infty, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccosh, 0.0, minus_infty, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccosh, minus_zero, minus_infty, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + + TEST_c_c (ccosh, plus_infty, 0.0, plus_infty, 0.0); + TEST_c_c (ccosh, minus_infty, 0.0, plus_infty, minus_zero); + TEST_c_c (ccosh, plus_infty, minus_zero, plus_infty, minus_zero); + TEST_c_c (ccosh, minus_infty, minus_zero, plus_infty, 0.0); + + TEST_c_c (ccosh, plus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccosh, minus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccosh, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccosh, minus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + + TEST_c_c (ccosh, plus_infty, 4.625, minus_infty, minus_infty); + TEST_c_c (ccosh, minus_infty, 4.625, minus_infty, plus_infty); + TEST_c_c (ccosh, plus_infty, -4.625, minus_infty, plus_infty); + TEST_c_c (ccosh, minus_infty, -4.625, minus_infty, minus_infty); + + TEST_c_c (ccosh, 6.75, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccosh, -6.75, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccosh, 6.75, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ccosh, -6.75, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (ccosh, 0.0, nan_value, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccosh, minus_zero, nan_value, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (ccosh, plus_infty, nan_value, plus_infty, nan_value); + TEST_c_c (ccosh, minus_infty, nan_value, plus_infty, nan_value); + + TEST_c_c (ccosh, 9.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ccosh, -9.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ccosh, nan_value, 0.0, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + TEST_c_c (ccosh, nan_value, minus_zero, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (ccosh, nan_value, 10.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ccosh, nan_value, -10.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ccosh, nan_value, plus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ccosh, nan_value, minus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ccosh, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (ccosh, 0.7, 1.2, 0.4548202223691477654L, 0.7070296600921537682L); + + TEST_c_c (ccosh, -2, -3, -3.7245455049153225654L, 0.5118225699873846088L); + + END (ccosh); +} + + +static void +ceil_test (void) +{ + START (ceil); + + TEST_f_f (ceil, 0.0, 0.0); + TEST_f_f (ceil, minus_zero, minus_zero); + TEST_f_f (ceil, plus_infty, plus_infty); + TEST_f_f (ceil, minus_infty, minus_infty); + + TEST_f_f (ceil, M_PIl, 4.0); + TEST_f_f (ceil, -M_PIl, -3.0); + + END (ceil); +} + + +static void +cexp_test (void) +{ + START (cexp); + + TEST_c_c (cexp, plus_zero, plus_zero, 1, 0.0); + TEST_c_c (cexp, minus_zero, plus_zero, 1, 0.0); + TEST_c_c (cexp, plus_zero, minus_zero, 1, minus_zero); + TEST_c_c (cexp, minus_zero, minus_zero, 1, minus_zero); + + TEST_c_c (cexp, plus_infty, plus_zero, plus_infty, 0.0); + TEST_c_c (cexp, plus_infty, minus_zero, plus_infty, minus_zero); + + TEST_c_c (cexp, minus_infty, plus_zero, 0.0, 0.0); + TEST_c_c (cexp, minus_infty, minus_zero, 0.0, minus_zero); + + TEST_c_c (cexp, 0.0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (cexp, minus_zero, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (cexp, 0.0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (cexp, minus_zero, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (cexp, 100.0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (cexp, -100.0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (cexp, 100.0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (cexp, -100.0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (cexp, minus_infty, 2.0, minus_zero, 0.0); + TEST_c_c (cexp, minus_infty, 4.0, minus_zero, minus_zero); + TEST_c_c (cexp, plus_infty, 2.0, minus_infty, plus_infty); + TEST_c_c (cexp, plus_infty, 4.0, minus_infty, minus_infty); + + TEST_c_c (cexp, plus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (cexp, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + + TEST_c_c (cexp, minus_infty, plus_infty, 0.0, 0.0, IGNORE_ZERO_INF_SIGN); + TEST_c_c (cexp, minus_infty, minus_infty, 0.0, minus_zero, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (cexp, minus_infty, nan_value, 0, 0, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (cexp, plus_infty, nan_value, plus_infty, nan_value); + + TEST_c_c (cexp, nan_value, 0.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (cexp, nan_value, 1.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (cexp, nan_value, plus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (cexp, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (cexp, 1, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (cexp, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (cexp, 0.7, 1.2, 0.7296989091503236012L, 1.8768962328348102821L); + TEST_c_c (cexp, -2.0, -3.0, -0.1339809149295426134L, -0.0190985162611351964L); + + END (cexp); +} + +static void +clog_test (void) +{ + START (clog); + + TEST_c_c (clog, minus_zero, 0, minus_infty, M_PIl, DIVIDE_BY_ZERO_EXCEPTION); + TEST_c_c (clog, minus_zero, minus_zero, minus_infty, -M_PIl, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_c_c (clog, 0, 0, minus_infty, 0.0, DIVIDE_BY_ZERO_EXCEPTION); + TEST_c_c (clog, 0, minus_zero, minus_infty, minus_zero, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_c_c (clog, minus_infty, plus_infty, plus_infty, M_PI_34l); + TEST_c_c (clog, minus_infty, minus_infty, plus_infty, -M_PI_34l); + + TEST_c_c (clog, plus_infty, plus_infty, plus_infty, M_PI_4l); + TEST_c_c (clog, plus_infty, minus_infty, plus_infty, -M_PI_4l); + + TEST_c_c (clog, 0, plus_infty, plus_infty, M_PI_2l); + TEST_c_c (clog, 3, plus_infty, plus_infty, M_PI_2l); + TEST_c_c (clog, minus_zero, plus_infty, plus_infty, M_PI_2l); + TEST_c_c (clog, -3, plus_infty, plus_infty, M_PI_2l); + TEST_c_c (clog, 0, minus_infty, plus_infty, -M_PI_2l); + TEST_c_c (clog, 3, minus_infty, plus_infty, -M_PI_2l); + TEST_c_c (clog, minus_zero, minus_infty, plus_infty, -M_PI_2l); + TEST_c_c (clog, -3, minus_infty, plus_infty, -M_PI_2l); + + TEST_c_c (clog, minus_infty, 0, plus_infty, M_PIl); + TEST_c_c (clog, minus_infty, 1, plus_infty, M_PIl); + TEST_c_c (clog, minus_infty, minus_zero, plus_infty, -M_PIl); + TEST_c_c (clog, minus_infty, -1, plus_infty, -M_PIl); + + TEST_c_c (clog, plus_infty, 0, plus_infty, 0.0); + TEST_c_c (clog, plus_infty, 1, plus_infty, 0.0); + TEST_c_c (clog, plus_infty, minus_zero, plus_infty, minus_zero); + TEST_c_c (clog, plus_infty, -1, plus_infty, minus_zero); + + TEST_c_c (clog, plus_infty, nan_value, plus_infty, nan_value); + TEST_c_c (clog, minus_infty, nan_value, plus_infty, nan_value); + + TEST_c_c (clog, nan_value, plus_infty, plus_infty, nan_value); + TEST_c_c (clog, nan_value, minus_infty, plus_infty, nan_value); + + TEST_c_c (clog, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog, 3, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog, minus_zero, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog, -3, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (clog, nan_value, 0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog, nan_value, 5, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog, nan_value, minus_zero, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog, nan_value, -5, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (clog, nan_value, nan_value, nan_value, nan_value); + TEST_c_c (clog, -2, -3, 1.2824746787307683680L, -2.1587989303424641704L); + + END (clog); +} + + +static void +clog10_test (void) +{ + START (clog10); + + TEST_c_c (clog10, minus_zero, 0, minus_infty, M_PIl, DIVIDE_BY_ZERO_EXCEPTION); + TEST_c_c (clog10, minus_zero, minus_zero, minus_infty, -M_PIl, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_c_c (clog10, 0, 0, minus_infty, 0.0, DIVIDE_BY_ZERO_EXCEPTION); + TEST_c_c (clog10, 0, minus_zero, minus_infty, minus_zero, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_c_c (clog10, minus_infty, plus_infty, plus_infty, M_PI_34_LOG10El); + + TEST_c_c (clog10, plus_infty, plus_infty, plus_infty, M_PI4_LOG10El); + TEST_c_c (clog10, plus_infty, minus_infty, plus_infty, -M_PI4_LOG10El); + + TEST_c_c (clog10, 0, plus_infty, plus_infty, M_PI2_LOG10El); + TEST_c_c (clog10, 3, plus_infty, plus_infty, M_PI2_LOG10El); + TEST_c_c (clog10, minus_zero, plus_infty, plus_infty, M_PI2_LOG10El); + TEST_c_c (clog10, -3, plus_infty, plus_infty, M_PI2_LOG10El); + TEST_c_c (clog10, 0, minus_infty, plus_infty, -M_PI2_LOG10El); + TEST_c_c (clog10, 3, minus_infty, plus_infty, -M_PI2_LOG10El); + TEST_c_c (clog10, minus_zero, minus_infty, plus_infty, -M_PI2_LOG10El); + TEST_c_c (clog10, -3, minus_infty, plus_infty, -M_PI2_LOG10El); + + TEST_c_c (clog10, minus_infty, 0, plus_infty, M_PI_LOG10El); + TEST_c_c (clog10, minus_infty, 1, plus_infty, M_PI_LOG10El); + TEST_c_c (clog10, minus_infty, minus_zero, plus_infty, -M_PI_LOG10El); + TEST_c_c (clog10, minus_infty, -1, plus_infty, -M_PI_LOG10El); + + TEST_c_c (clog10, plus_infty, 0, plus_infty, 0.0); + TEST_c_c (clog10, plus_infty, 1, plus_infty, 0.0); + TEST_c_c (clog10, plus_infty, minus_zero, plus_infty, minus_zero); + TEST_c_c (clog10, plus_infty, -1, plus_infty, minus_zero); + + TEST_c_c (clog10, plus_infty, nan_value, plus_infty, nan_value); + TEST_c_c (clog10, minus_infty, nan_value, plus_infty, nan_value); + + TEST_c_c (clog10, nan_value, plus_infty, plus_infty, nan_value); + TEST_c_c (clog10, nan_value, minus_infty, plus_infty, nan_value); + + TEST_c_c (clog10, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog10, 3, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog10, minus_zero, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog10, -3, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (clog10, nan_value, 0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog10, nan_value, 5, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog10, nan_value, minus_zero, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (clog10, nan_value, -5, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (clog10, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (clog10, 0.7, 1.2, 0.1427786545038868803L, 0.4528483579352493248L); + TEST_c_c (clog10, -2, -3, 0.5569716761534183846L, -0.9375544629863747085L); + + END (clog10); +} + +static void +copysign_test (void) +{ + START (copysign); + + TEST_ff_f (copysign, 0, 4, 0); + TEST_ff_f (copysign, 0, -4, minus_zero); + TEST_ff_f (copysign, minus_zero, 4, 0); + TEST_ff_f (copysign, minus_zero, -4, minus_zero); + + TEST_ff_f (copysign, plus_infty, 0, plus_infty); + TEST_ff_f (copysign, plus_infty, minus_zero, minus_infty); + TEST_ff_f (copysign, minus_infty, 0, plus_infty); + TEST_ff_f (copysign, minus_infty, minus_zero, minus_infty); + + TEST_ff_f (copysign, 0, plus_infty, 0); + TEST_ff_f (copysign, 0, minus_zero, minus_zero); + TEST_ff_f (copysign, minus_zero, plus_infty, 0); + TEST_ff_f (copysign, minus_zero, minus_zero, minus_zero); + + /* XXX More correctly we would have to check the sign of the NaN. */ + TEST_ff_f (copysign, nan_value, 0, nan_value); + TEST_ff_f (copysign, nan_value, minus_zero, nan_value); + TEST_ff_f (copysign, -nan_value, 0, nan_value); + TEST_ff_f (copysign, -nan_value, minus_zero, nan_value); + + END (copysign); +} + +static void +cos_test (void) +{ + START (cos); + + TEST_f_f (cos, 0, 1); + TEST_f_f (cos, minus_zero, 1); + TEST_f_f (cos, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_f_f (cos, minus_infty, nan_value, INVALID_EXCEPTION); + + TEST_f_f (cos, M_PI_6l * 2.0, 0.5); + TEST_f_f (cos, M_PI_6l * 4.0, -0.5); + TEST_f_f (cos, M_PI_2l, 0); + + TEST_f_f (cos, 0.7, 0.7648421872844884262L); + + END (cos); +} + +static void +cosh_test (void) +{ + START (cosh); + TEST_f_f (cosh, 0, 1); + TEST_f_f (cosh, minus_zero, 1); + + TEST_f_f (cosh, plus_infty, plus_infty); + TEST_f_f (cosh, minus_infty, plus_infty); + + TEST_f_f (cosh, 0.7, 1.255169005630943018L); + END (cosh); +} + + +static void +cpow_test (void) +{ + START (cpow); + + TEST_cc_c (cpow, 1, 0, 0, 0, 1.0, 0.0); + TEST_cc_c (cpow, 2, 0, 10, 0, 1024.0, 0.0); + + TEST_cc_c (cpow, M_El, 0, 0, 2 * M_PIl, 1.0, 0.0); + TEST_cc_c (cpow, 2, 3, 4, 0, -119.0, -120.0); + + END (cpow); +} + +static void +cproj_test (void) +{ + START (cproj); + TEST_c_c (cproj, 0.0, 0.0, 0.0, 0.0); + TEST_c_c (cproj, minus_zero, minus_zero, minus_zero, minus_zero); + TEST_c_c (cproj, 0.0, minus_zero, 0.0, minus_zero); + TEST_c_c (cproj, minus_zero, 0.0, minus_zero, 0.0); + + TEST_c_c (cproj, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (cproj, plus_infty, plus_infty, plus_infty, 0.0); + TEST_c_c (cproj, plus_infty, minus_infty, plus_infty, minus_zero); + TEST_c_c (cproj, minus_infty, plus_infty, plus_infty, 0.0); + TEST_c_c (cproj, minus_infty, minus_infty, plus_infty, minus_zero); + + TEST_c_c (cproj, 1.0, 0.0, 1.0, 0.0); + TEST_c_c (cproj, 2.0, 3.0, 0.28571428571428571429L, .42857142857142857143L); + + END (cproj); +} + + +static void +csin_test (void) +{ + + START (csin); + + TEST_c_c (csin, 0.0, 0.0, 0.0, 0.0); + TEST_c_c (csin, minus_zero, 0.0, minus_zero, 0.0); + TEST_c_c (csin, 0.0, minus_zero, 0, minus_zero); + TEST_c_c (csin, minus_zero, minus_zero, minus_zero, minus_zero); + + TEST_c_c (csin, 0.0, plus_infty, 0.0, plus_infty); + TEST_c_c (csin, minus_zero, plus_infty, minus_zero, plus_infty); + TEST_c_c (csin, 0.0, minus_infty, 0.0, minus_infty); + TEST_c_c (csin, minus_zero, minus_infty, minus_zero, minus_infty); + + TEST_c_c (csin, plus_infty, 0.0, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csin, minus_infty, 0.0, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csin, plus_infty, minus_zero, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csin, minus_infty, minus_zero, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + + TEST_c_c (csin, plus_infty, plus_infty, nan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csin, minus_infty, plus_infty, nan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csin, plus_infty, minus_infty, nan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csin, minus_infty, minus_infty, nan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + + TEST_c_c (csin, plus_infty, 6.75, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (csin, plus_infty, -6.75, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (csin, minus_infty, 6.75, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (csin, minus_infty, -6.75, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (csin, 4.625, plus_infty, minus_infty, minus_infty); + TEST_c_c (csin, 4.625, minus_infty, minus_infty, plus_infty); + TEST_c_c (csin, -4.625, plus_infty, plus_infty, minus_infty); + TEST_c_c (csin, -4.625, minus_infty, plus_infty, plus_infty); + + TEST_c_c (csin, nan_value, 0.0, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + TEST_c_c (csin, nan_value, minus_zero, nan_value, 0.0, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (csin, nan_value, plus_infty, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN); + TEST_c_c (csin, nan_value, minus_infty, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (csin, nan_value, 9.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csin, nan_value, -9.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (csin, 0.0, nan_value, 0.0, nan_value); + TEST_c_c (csin, minus_zero, nan_value, minus_zero, nan_value); + + TEST_c_c (csin, 10.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csin, nan_value, -10.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (csin, plus_infty, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csin, minus_infty, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (csin, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (csin, 0.7, 1.2, 1.1664563419657581376L, 1.1544997246948547371L); + + TEST_c_c (csin, -2, -3, -9.1544991469114295734L, 4.1689069599665643507L); + + END (csin); +} + + +static void +csinh_test (void) +{ + + START (csinh); + + TEST_c_c (csinh, 0.0, 0.0, 0.0, 0.0); + TEST_c_c (csinh, minus_zero, 0.0, minus_zero, 0.0); + TEST_c_c (csinh, 0.0, minus_zero, 0.0, minus_zero); + TEST_c_c (csinh, minus_zero, minus_zero, minus_zero, minus_zero); + + TEST_c_c (csinh, 0.0, plus_infty, 0.0, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csinh, minus_zero, plus_infty, 0.0, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csinh, 0.0, minus_infty, 0.0, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csinh, minus_zero, minus_infty, 0.0, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + + TEST_c_c (csinh, plus_infty, 0.0, plus_infty, 0.0); + TEST_c_c (csinh, minus_infty, 0.0, minus_infty, 0.0); + TEST_c_c (csinh, plus_infty, minus_zero, plus_infty, minus_zero); + TEST_c_c (csinh, minus_infty, minus_zero, minus_infty, minus_zero); + + TEST_c_c (csinh, plus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csinh, minus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csinh, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + TEST_c_c (csinh, minus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN); + + TEST_c_c (csinh, plus_infty, 4.625, minus_infty, minus_infty); + TEST_c_c (csinh, minus_infty, 4.625, plus_infty, minus_infty); + TEST_c_c (csinh, plus_infty, -4.625, minus_infty, plus_infty); + TEST_c_c (csinh, minus_infty, -4.625, plus_infty, plus_infty); + + TEST_c_c (csinh, 6.75, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (csinh, -6.75, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (csinh, 6.75, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (csinh, -6.75, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (csinh, 0.0, nan_value, 0.0, nan_value, IGNORE_ZERO_INF_SIGN); + TEST_c_c (csinh, minus_zero, nan_value, 0.0, nan_value, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (csinh, plus_infty, nan_value, plus_infty, nan_value, IGNORE_ZERO_INF_SIGN); + TEST_c_c (csinh, minus_infty, nan_value, plus_infty, nan_value, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (csinh, 9.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (csinh, -9.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (csinh, nan_value, 0.0, nan_value, 0.0); + TEST_c_c (csinh, nan_value, minus_zero, nan_value, minus_zero); + + TEST_c_c (csinh, nan_value, 10.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csinh, nan_value, -10.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (csinh, nan_value, plus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csinh, nan_value, minus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (csinh, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (csinh, 0.7, 1.2, 0.27487868678117583582L, 1.1698665727426565139L); + TEST_c_c (csinh, -2, -3, 3.5905645899857799520L, -0.5309210862485198052L); + + END (csinh); +} + +static void +csqrt_test (void) +{ + START (csqrt); + + TEST_c_c (csqrt, 0, 0, 0.0, 0.0); + TEST_c_c (csqrt, 0, minus_zero, 0, minus_zero); + TEST_c_c (csqrt, minus_zero, 0, 0.0, 0.0); + TEST_c_c (csqrt, minus_zero, minus_zero, 0.0, minus_zero); + + TEST_c_c (csqrt, minus_infty, 0, 0.0, plus_infty); + TEST_c_c (csqrt, minus_infty, 6, 0.0, plus_infty); + TEST_c_c (csqrt, minus_infty, minus_zero, 0.0, minus_infty); + TEST_c_c (csqrt, minus_infty, -6, 0.0, minus_infty); + + TEST_c_c (csqrt, plus_infty, 0, plus_infty, 0.0); + TEST_c_c (csqrt, plus_infty, 6, plus_infty, 0.0); + TEST_c_c (csqrt, plus_infty, minus_zero, plus_infty, minus_zero); + TEST_c_c (csqrt, plus_infty, -6, plus_infty, minus_zero); + + TEST_c_c (csqrt, 0, plus_infty, plus_infty, plus_infty); + TEST_c_c (csqrt, 4, plus_infty, plus_infty, plus_infty); + TEST_c_c (csqrt, plus_infty, plus_infty, plus_infty, plus_infty); + TEST_c_c (csqrt, minus_zero, plus_infty, plus_infty, plus_infty); + TEST_c_c (csqrt, -4, plus_infty, plus_infty, plus_infty); + TEST_c_c (csqrt, minus_infty, plus_infty, plus_infty, plus_infty); + TEST_c_c (csqrt, 0, minus_infty, plus_infty, minus_infty); + TEST_c_c (csqrt, 4, minus_infty, plus_infty, minus_infty); + TEST_c_c (csqrt, plus_infty, minus_infty, plus_infty, minus_infty); + TEST_c_c (csqrt, minus_zero, minus_infty, plus_infty, minus_infty); + TEST_c_c (csqrt, -4, minus_infty, plus_infty, minus_infty); + TEST_c_c (csqrt, minus_infty, minus_infty, plus_infty, minus_infty); + + TEST_c_c (csqrt, minus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (csqrt, plus_infty, nan_value, plus_infty, nan_value); + + TEST_c_c (csqrt, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csqrt, 1, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csqrt, minus_zero, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csqrt, -1, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (csqrt, nan_value, 0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csqrt, nan_value, 8, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csqrt, nan_value, minus_zero, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (csqrt, nan_value, -8, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (csqrt, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (csqrt, 16.0, -30.0, 5.0, -3.0); + TEST_c_c (csqrt, -1, 0, 0.0, 1.0); + TEST_c_c (csqrt, 0, 2, 1.0, 1.0); + TEST_c_c (csqrt, 119, 120, 12.0, 5.0); + TEST_c_c (csqrt, 0.7, 1.2, 1.0220676100300264507L, 0.5870453129635652115L); + TEST_c_c (csqrt, -2, -3, 0.8959774761298381247L, -1.6741492280355400404L); + TEST_c_c (csqrt, -2, 3, 0.8959774761298381247L, 1.6741492280355400404L); + + END (csqrt); +} + +static void +ctan_test (void) +{ + START (ctan); + + TEST_c_c (ctan, 0, 0, 0.0, 0.0); + TEST_c_c (ctan, 0, minus_zero, 0.0, minus_zero); + TEST_c_c (ctan, minus_zero, 0, minus_zero, 0.0); + TEST_c_c (ctan, minus_zero, minus_zero, minus_zero, minus_zero); + + TEST_c_c (ctan, 0, plus_infty, 0.0, 1.0); + TEST_c_c (ctan, 1, plus_infty, 0.0, 1.0); + TEST_c_c (ctan, minus_zero, plus_infty, minus_zero, 1.0); + TEST_c_c (ctan, -1, plus_infty, minus_zero, 1.0); + + TEST_c_c (ctan, 0, minus_infty, 0.0, -1.0); + TEST_c_c (ctan, 1, minus_infty, 0.0, -1.0); + TEST_c_c (ctan, minus_zero, minus_infty, minus_zero, -1.0); + TEST_c_c (ctan, -1, minus_infty, minus_zero, -1.0); + + TEST_c_c (ctan, plus_infty, 0, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctan, plus_infty, 2, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctan, minus_infty, 0, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctan, minus_infty, 2, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctan, plus_infty, minus_zero, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctan, plus_infty, -2, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctan, minus_infty, minus_zero, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctan, minus_infty, -2, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (ctan, nan_value, plus_infty, 0.0, 1.0, IGNORE_ZERO_INF_SIGN); + TEST_c_c (ctan, nan_value, minus_infty, 0.0, -1.0, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (ctan, 0, nan_value, 0.0, nan_value); + TEST_c_c (ctan, minus_zero, nan_value, minus_zero, nan_value); + + TEST_c_c (ctan, 0.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ctan, -4.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ctan, nan_value, 0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ctan, nan_value, 5, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ctan, nan_value, minus_zero, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ctan, nan_value, -0.25, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ctan, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (ctan, 0.7, 1.2, 0.1720734197630349001L, 0.9544807059989405538L); + TEST_c_c (ctan, -2, -3, 0.0037640256415042482L, -1.0032386273536098014L); + + END (ctan); +} + + +static void +ctanh_test (void) +{ + START (ctanh); + + TEST_c_c (ctanh, 0, 0, 0.0, 0.0); + TEST_c_c (ctanh, 0, minus_zero, 0.0, minus_zero); + TEST_c_c (ctanh, minus_zero, 0, minus_zero, 0.0); + TEST_c_c (ctanh, minus_zero, minus_zero, minus_zero, minus_zero); + + TEST_c_c (ctanh, plus_infty, 0, 1.0, 0.0); + TEST_c_c (ctanh, plus_infty, 1, 1.0, 0.0); + TEST_c_c (ctanh, plus_infty, minus_zero, 1.0, minus_zero); + TEST_c_c (ctanh, plus_infty, -1, 1.0, minus_zero); + TEST_c_c (ctanh, minus_infty, 0, -1.0, 0.0); + TEST_c_c (ctanh, minus_infty, 1, -1.0, 0.0); + TEST_c_c (ctanh, minus_infty, minus_zero, -1.0, minus_zero); + TEST_c_c (ctanh, minus_infty, -1, -1.0, minus_zero); + + TEST_c_c (ctanh, 0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctanh, 2, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctanh, 0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctanh, 2, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctanh, minus_zero, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctanh, -2, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctanh, minus_zero, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_c_c (ctanh, -2, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_c_c (ctanh, plus_infty, nan_value, 1.0, 0.0, IGNORE_ZERO_INF_SIGN); + TEST_c_c (ctanh, minus_infty, nan_value, -1.0, 0.0, IGNORE_ZERO_INF_SIGN); + + TEST_c_c (ctanh, nan_value, 0, nan_value, 0.0); + TEST_c_c (ctanh, nan_value, minus_zero, nan_value, minus_zero); + + TEST_c_c (ctanh, nan_value, 0.5, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ctanh, nan_value, -4.5, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ctanh, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ctanh, 5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ctanh, minus_zero, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_c_c (ctanh, -0.25, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK); + + TEST_c_c (ctanh, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (ctanh, 0, M_PI_4l, 0.0, 1.0); + + TEST_c_c (ctanh, 0.7, 1.2, 1.3472197399061191630L, 0.4778641038326365540L); + TEST_c_c (ctanh, -2, -3, -0.9653858790221331242L, 0.0098843750383224937L); + + END (ctanh); +} + +static void +erf_test (void) +{ + errno = 0; + FUNC(erf) (0); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + START (erf); + + TEST_f_f (erf, 0, 0); + TEST_f_f (erf, minus_zero, minus_zero); + TEST_f_f (erf, plus_infty, 1); + TEST_f_f (erf, minus_infty, -1); + + TEST_f_f (erf, 0.7, 0.67780119383741847297L); + + TEST_f_f (erf, 1.2, 0.91031397822963538024L); + TEST_f_f (erf, 2.0, 0.99532226501895273416L); + TEST_f_f (erf, 4.1, 0.99999999329997234592L); + TEST_f_f (erf, 27, 1.0L); + + END (erf); +} + + +static void +erfc_test (void) +{ + errno = 0; + FUNC(erfc) (0); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + START (erfc); + + TEST_f_f (erfc, plus_infty, 0.0); + TEST_f_f (erfc, minus_infty, 2.0); + TEST_f_f (erfc, 0.0, 1.0); + TEST_f_f (erfc, minus_zero, 1.0); + + TEST_f_f (erfc, 0.7, 0.32219880616258152702L); + + TEST_f_f (erfc, 1.2, 0.089686021770364619762L); + TEST_f_f (erfc, 2.0, 0.0046777349810472658379L); + TEST_f_f (erfc, 4.1, 0.67000276540848983727e-8L); + TEST_f_f (erfc, 9, 0.41370317465138102381e-36L); + + END (erfc); +} + +static void +exp_test (void) +{ + START (exp); + + TEST_f_f (exp, 0, 1); + TEST_f_f (exp, minus_zero, 1); + + TEST_f_f (exp, plus_infty, plus_infty); + TEST_f_f (exp, minus_infty, 0); + TEST_f_f (exp, 1, M_El); + + TEST_f_f (exp, 2, M_E2l); + TEST_f_f (exp, 3, M_E3l); + TEST_f_f (exp, 0.7, 2.0137527074704765216L); + + END (exp); +} + + +static void +exp10_test (void) +{ + errno = 0; + FUNC(exp10) (0); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + START (exp10); + + TEST_f_f (exp10, 0, 1); + TEST_f_f (exp10, minus_zero, 1); + + TEST_f_f (exp10, plus_infty, plus_infty); + TEST_f_f (exp10, minus_infty, 0); + TEST_f_f (exp10, 3, 1000); + TEST_f_f (exp10, -1, 0.1); + TEST_f_f (exp10, 1e6, plus_infty); + TEST_f_f (exp10, -1e6, 0); + TEST_f_f (exp10, 0.7, 5.0118723362727228500L); + + END (exp10); +} + +static void +exp2_test (void) +{ + errno = 0; + FUNC(exp2) (0); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + START (exp2); + + TEST_f_f (exp2, 0, 1); + TEST_f_f (exp2, minus_zero, 1); + TEST_f_f (exp2, plus_infty, plus_infty); + TEST_f_f (exp2, minus_infty, 0); + TEST_f_f (exp2, 10, 1024); + TEST_f_f (exp2, -1, 0.5); + TEST_f_f (exp2, 1e6, plus_infty); + TEST_f_f (exp2, -1e6, 0); + TEST_f_f (exp2, 0.7, 1.6245047927124710452L); + + END (exp2); +} + +static void +expm1_test (void) +{ + START (expm1); + + TEST_f_f (expm1, 0, 0); + TEST_f_f (expm1, minus_zero, minus_zero); + + TEST_f_f (expm1, plus_infty, plus_infty); + TEST_f_f (expm1, minus_infty, -1); + + TEST_f_f (expm1, 1, M_El - 1.0); + TEST_f_f (expm1, 0.7, 1.0137527074704765216L); + + END (expm1); +} + +static void +fabs_test (void) +{ + START (fabs); + + TEST_f_f (fabs, 0, 0); + TEST_f_f (fabs, minus_zero, 0); + + TEST_f_f (fabs, plus_infty, plus_infty); + TEST_f_f (fabs, minus_infty, plus_infty); + + TEST_f_f (fabs, 38.0, 38.0); + TEST_f_f (fabs, -M_El, M_El); + + END (fabs); +} + +static void +fdim_test (void) +{ + START (fdim); + + TEST_ff_f (fdim, 0, 0, 0); + TEST_ff_f (fdim, 9, 0, 9); + TEST_ff_f (fdim, 0, 9, 0); + TEST_ff_f (fdim, -9, 0, 0); + TEST_ff_f (fdim, 0, -9, 9); + + TEST_ff_f (fdim, plus_infty, 9, plus_infty); + TEST_ff_f (fdim, plus_infty, -9, plus_infty); + TEST_ff_f (fdim, minus_infty, 9, 0); + TEST_ff_f (fdim, minus_infty, -9, 0); + TEST_ff_f (fdim, 9, minus_infty, plus_infty); + TEST_ff_f (fdim, -9, minus_infty, plus_infty); + TEST_ff_f (fdim, 9, plus_infty, 0); + TEST_ff_f (fdim, -9, plus_infty, 0); + + TEST_ff_f (fdim, 0, nan_value, nan_value); + TEST_ff_f (fdim, 9, nan_value, nan_value); + TEST_ff_f (fdim, -9, nan_value, nan_value); + TEST_ff_f (fdim, nan_value, 9, nan_value); + TEST_ff_f (fdim, nan_value, -9, nan_value); + TEST_ff_f (fdim, plus_infty, nan_value, nan_value); + TEST_ff_f (fdim, minus_infty, nan_value, nan_value); + TEST_ff_f (fdim, nan_value, plus_infty, nan_value); + TEST_ff_f (fdim, nan_value, minus_infty, nan_value); + TEST_ff_f (fdim, nan_value, nan_value, nan_value); + + END (fdim); +} + +static void +floor_test (void) +{ + START (floor); + + TEST_f_f (floor, 0.0, 0.0); + TEST_f_f (floor, minus_zero, minus_zero); + TEST_f_f (floor, plus_infty, plus_infty); + TEST_f_f (floor, minus_infty, minus_infty); + + TEST_f_f (floor, M_PIl, 3.0); + TEST_f_f (floor, -M_PIl, -4.0); + + END (floor); +} + +static void +fma_test (void) +{ + START (fma); + + TEST_fff_f (fma, 1.0, 2.0, 3.0, 5.0); + TEST_fff_f (fma, nan_value, 2.0, 3.0, nan_value); + TEST_fff_f (fma, 1.0, nan_value, 3.0, nan_value); + TEST_fff_f (fma, 1.0, 2.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_fff_f (fma, plus_infty, 0.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_fff_f (fma, minus_infty, 0.0, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_fff_f (fma, 0.0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_fff_f (fma, 0.0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK); + TEST_fff_f (fma, plus_infty, 0.0, 1.0, nan_value, INVALID_EXCEPTION); + TEST_fff_f (fma, minus_infty, 0.0, 1.0, nan_value, INVALID_EXCEPTION); + TEST_fff_f (fma, 0.0, plus_infty, 1.0, nan_value, INVALID_EXCEPTION); + TEST_fff_f (fma, 0.0, minus_infty, 1.0, nan_value, INVALID_EXCEPTION); + + TEST_fff_f (fma, plus_infty, plus_infty, minus_infty, nan_value, INVALID_EXCEPTION); + TEST_fff_f (fma, minus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_fff_f (fma, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_fff_f (fma, minus_infty, minus_infty, minus_infty, nan_value, INVALID_EXCEPTION); + + END (fma); +} + + +static void +fmax_test (void) +{ + START (fmax); + + TEST_ff_f (fmax, 0, 0, 0); + TEST_ff_f (fmax, minus_zero, minus_zero, minus_zero); + TEST_ff_f (fmax, 9, 0, 9); + TEST_ff_f (fmax, 0, 9, 9); + TEST_ff_f (fmax, -9, 0, 0); + TEST_ff_f (fmax, 0, -9, 0); + + TEST_ff_f (fmax, plus_infty, 9, plus_infty); + TEST_ff_f (fmax, 0, plus_infty, plus_infty); + TEST_ff_f (fmax, -9, plus_infty, plus_infty); + TEST_ff_f (fmax, plus_infty, -9, plus_infty); + + TEST_ff_f (fmax, minus_infty, 9, 9); + TEST_ff_f (fmax, minus_infty, -9, -9); + TEST_ff_f (fmax, 9, minus_infty, 9); + TEST_ff_f (fmax, -9, minus_infty, -9); + + TEST_ff_f (fmax, 0, nan_value, 0); + TEST_ff_f (fmax, 9, nan_value, 9); + TEST_ff_f (fmax, -9, nan_value, -9); + TEST_ff_f (fmax, nan_value, 0, 0); + TEST_ff_f (fmax, nan_value, 9, 9); + TEST_ff_f (fmax, nan_value, -9, -9); + TEST_ff_f (fmax, plus_infty, nan_value, plus_infty); + TEST_ff_f (fmax, minus_infty, nan_value, minus_infty); + TEST_ff_f (fmax, nan_value, plus_infty, plus_infty); + TEST_ff_f (fmax, nan_value, minus_infty, minus_infty); + TEST_ff_f (fmax, nan_value, nan_value, nan_value); + + END (fmax); +} + + +static void +fmin_test (void) +{ + START (fmin); + + TEST_ff_f (fmin, 0, 0, 0); + TEST_ff_f (fmin, minus_zero, minus_zero, minus_zero); + TEST_ff_f (fmin, 9, 0, 0); + TEST_ff_f (fmin, 0, 9, 0); + TEST_ff_f (fmin, -9, 0, -9); + TEST_ff_f (fmin, 0, -9, -9); + + TEST_ff_f (fmin, plus_infty, 9, 9); + TEST_ff_f (fmin, 9, plus_infty, 9); + TEST_ff_f (fmin, plus_infty, -9, -9); + TEST_ff_f (fmin, -9, plus_infty, -9); + TEST_ff_f (fmin, minus_infty, 9, minus_infty); + TEST_ff_f (fmin, minus_infty, -9, minus_infty); + TEST_ff_f (fmin, 9, minus_infty, minus_infty); + TEST_ff_f (fmin, -9, minus_infty, minus_infty); + + TEST_ff_f (fmin, 0, nan_value, 0); + TEST_ff_f (fmin, 9, nan_value, 9); + TEST_ff_f (fmin, -9, nan_value, -9); + TEST_ff_f (fmin, nan_value, 0, 0); + TEST_ff_f (fmin, nan_value, 9, 9); + TEST_ff_f (fmin, nan_value, -9, -9); + TEST_ff_f (fmin, plus_infty, nan_value, plus_infty); + TEST_ff_f (fmin, minus_infty, nan_value, minus_infty); + TEST_ff_f (fmin, nan_value, plus_infty, plus_infty); + TEST_ff_f (fmin, nan_value, minus_infty, minus_infty); + TEST_ff_f (fmin, nan_value, nan_value, nan_value); + + END (fmin); +} + + +static void +fmod_test (void) +{ + + START (fmod); + + /* fmod (+0, y) == +0 for y != 0. */ + TEST_ff_f (fmod, 0, 3, 0); + + /* fmod (-0, y) == -0 for y != 0. */ + TEST_ff_f (fmod, minus_zero, 3, minus_zero); + + /* fmod (+inf, y) == NaN plus invalid exception. */ + TEST_ff_f (fmod, plus_infty, 3, nan_value, INVALID_EXCEPTION); + /* fmod (-inf, y) == NaN plus invalid exception. */ + TEST_ff_f (fmod, minus_infty, 3, nan_value, INVALID_EXCEPTION); + /* fmod (x, +0) == NaN plus invalid exception. */ + TEST_ff_f (fmod, 3, 0, nan_value, INVALID_EXCEPTION); + /* fmod (x, -0) == NaN plus invalid exception. */ + TEST_ff_f (fmod, 3, minus_zero, nan_value, INVALID_EXCEPTION); + + /* fmod (x, +inf) == x for x not infinite. */ + TEST_ff_f (fmod, 3.0, plus_infty, 3.0); + /* fmod (x, -inf) == x for x not infinite. */ + TEST_ff_f (fmod, 3.0, minus_infty, 3.0); + + TEST_ff_f (fmod, 6.5, 2.3, 1.9); + TEST_ff_f (fmod, -6.5, 2.3, -1.9); + TEST_ff_f (fmod, 6.5, -2.3, 1.9); + TEST_ff_f (fmod, -6.5, -2.3, -1.9); + + END (fmod); +} + +static void +fpclassify_test (void) +{ + START (fpclassify); + + TEST_f_i (fpclassify, nan_value, FP_NAN); + TEST_f_i (fpclassify, plus_infty, FP_INFINITE); + TEST_f_i (fpclassify, minus_infty, FP_INFINITE); + TEST_f_i (fpclassify, plus_zero, FP_ZERO); + TEST_f_i (fpclassify, minus_zero, FP_ZERO); + TEST_f_i (fpclassify, 1000, FP_NORMAL); + + END (fpclassify); +} + + +static void +frexp_test (void) +{ + int x; + + START (frexp); + + TEST_fI_f1 (frexp, plus_infty, plus_infty, IGNORE); + TEST_fI_f1 (frexp, minus_infty, minus_infty, IGNORE); + TEST_fI_f1 (frexp, nan_value, nan_value, IGNORE); + + TEST_fI_f1 (frexp, 0.0, 0.0, 0.0); + TEST_fI_f1 (frexp, minus_zero, minus_zero, 0.0); + + TEST_fI_f1 (frexp, 12.8, 0.8, 4); + TEST_fI_f1 (frexp, -27.34, -0.854375, 5); + + END (frexp); +} + + +static void +gamma_test (void) +{ + errno = 0; + FUNC(gamma) (1); + + if (errno == ENOSYS) + /* Function not implemented. */ + return; + feclearexcept (FE_ALL_EXCEPT); + + START (gamma); + + TEST_f_f (gamma, plus_infty, plus_infty); + TEST_f_f (gamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_f_f (gamma, -3, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_f_f (gamma, minus_infty, nan_value, INVALID_EXCEPTION); + + TEST_f_f1 (gamma, 1, 0, 1); + TEST_f_f1 (gamma, 3, M_LN2l, 1); + + TEST_f_f1 (gamma, 0.5, M_LOG_SQRT_PIl, 1); + TEST_f_f1 (gamma, -0.5, M_LOG_2_SQRT_PIl,-1); + + END (gamma); +} + +static void +hypot_test (void) +{ + START (hypot); + + TEST_ff_f (hypot, plus_infty, 1, plus_infty, IGNORE_ZERO_INF_SIGN); + TEST_ff_f (hypot, minus_infty, 1, plus_infty, IGNORE_ZERO_INF_SIGN); + + TEST_ff_f (hypot, plus_infty, nan_value, plus_infty); + TEST_ff_f (hypot, minus_infty, nan_value, plus_infty); + TEST_ff_f (hypot, nan_value, plus_infty, plus_infty); + TEST_ff_f (hypot, nan_value, minus_infty, plus_infty); + + TEST_ff_f (hypot, nan_value, nan_value, nan_value); + + /* hypot (x,y) == hypot (+-x, +-y) */ + TEST_ff_f (hypot, 0.7, 12.4, 12.41974234837422060118L); + TEST_ff_f (hypot, -0.7, 12.4, 12.41974234837422060118L); + TEST_ff_f (hypot, 0.7, -12.4, 12.41974234837422060118L); + TEST_ff_f (hypot, -0.7, -12.4, 12.41974234837422060118L); + TEST_ff_f (hypot, 12.4, 0.7, 12.41974234837422060118L); + TEST_ff_f (hypot, -12.4, 0.7, 12.41974234837422060118L); + TEST_ff_f (hypot, 12.4, -0.7, 12.41974234837422060118L); + TEST_ff_f (hypot, -12.4, -0.7, 12.41974234837422060118L); + + /* hypot (x,0) == fabs (x) */ + TEST_ff_f (hypot, 0.7, 0, 0.7); + TEST_ff_f (hypot, -0.7, 0, 0.7); + TEST_ff_f (hypot, -5.7e7, 0, 5.7e7); + + TEST_ff_f (hypot, 0.7, 1.2, 1.3892443989449804508L); + + END (hypot); +} + + +static void +ilogb_test (void) +{ + START (ilogb); + + TEST_f_i (ilogb, 1, 0); + TEST_f_i (ilogb, M_El, 1); + TEST_f_i (ilogb, 1024, 10); + TEST_f_i (ilogb, -2000, 10); + + /* XXX We have a problem here: the standard does not tell us whether + exceptions are allowed/required. ignore them for now. */ + + TEST_f_i (ilogb, 0.0, FP_ILOGB0, EXCEPTIONS_OK); + TEST_f_i (ilogb, nan_value, FP_ILOGBNAN, EXCEPTIONS_OK); + + END (ilogb); +} + +static void +isfinite_test (void) +{ + START (isfinite); + + TEST_f_b (isfinite, 0, 1); + TEST_f_b (isfinite, minus_zero, 1); + TEST_f_b (isfinite, 10, 1); + TEST_f_b (isfinite, plus_infty, 0); + TEST_f_b (isfinite, minus_infty, 0); + TEST_f_b (isfinite, nan_value, 0); + + END (isfinite); +} + +static void +isnormal_test (void) +{ + START (isnormal); + + TEST_f_b (isnormal, 0, 0); + TEST_f_b (isnormal, minus_zero, 0); + TEST_f_b (isnormal, 10, 1); + TEST_f_b (isnormal, plus_infty, 0); + TEST_f_b (isnormal, minus_infty, 0); + TEST_f_b (isnormal, nan_value, 0); + + END (isnormal); +} + +static void +j0_test (void) +{ + errno = 0; + FUNC(j0) (0); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + START (j0); + + /* j0 is the Bessel function of the first kind of order 0 */ + TEST_f_f (j0, nan_value, nan_value); + TEST_f_f (j0, plus_infty, 0); + TEST_f_f (j0, -1.0, 0.76519768655796655145); + TEST_f_f (j0, 0.0, 1.0); + TEST_f_f (j0, 0.1, 0.99750156206604003228); + TEST_f_f (j0, 0.7, 0.88120088860740528084); + TEST_f_f (j0, 1.0, 0.76519768655796655145); + TEST_f_f (j0, 1.5, 0.51182767173591812875); + TEST_f_f (j0, 2.0, 0.22389077914123566805); + TEST_f_f (j0, 8.0, 0.17165080713755390609); + TEST_f_f (j0, 10.0, -0.24593576445134833520); + + END (j0); +} + + +static void +j1_test (void) +{ + errno = 0; + FUNC(j1) (0); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + /* j1 is the Bessel function of the first kind of order 1 */ + + START (j1); + + TEST_f_f (j1, nan_value, nan_value); + TEST_f_f (j1, plus_infty, 0); + + TEST_f_f (j1, -1.0, -0.44005058574493351596); + TEST_f_f (j1, 0.0, 0.0); + TEST_f_f (j1, 0.1, 0.049937526036241997556); + TEST_f_f (j1, 0.7, 0.32899574154005894785); + TEST_f_f (j1, 1.0, 0.44005058574493351596); + TEST_f_f (j1, 1.5, 0.55793650791009964199); + TEST_f_f (j1, 2.0, 0.57672480775687338720); + TEST_f_f (j1, 8.0, 0.23463634685391462438); + TEST_f_f (j1, 10.0, 0.043472746168861436670); + + END (j1); +} + +static void +jn_test (void) +{ + errno = 0; + FUNC(jn) (1, 1); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + /* jn is the Bessel function of the first kind of order n. */ + START (jn); + + /* jn (0, x) == j0 (x) */ + TEST_ff_f (jn, 0, nan_value, nan_value); + TEST_ff_f (jn, 0, plus_infty, 0); + TEST_ff_f (jn, 0, -1.0, 0.76519768655796655145); + TEST_ff_f (jn, 0, 0.0, 1.0); + TEST_ff_f (jn, 0, 0.1, 0.99750156206604003228); + TEST_ff_f (jn, 0, 0.7, 0.88120088860740528084); + TEST_ff_f (jn, 0, 1.0, 0.76519768655796655145); + TEST_ff_f (jn, 0, 1.5, 0.51182767173591812875); + TEST_ff_f (jn, 0, 2.0, 0.22389077914123566805); + TEST_ff_f (jn, 0, 8.0, 0.17165080713755390609); + TEST_ff_f (jn, 0, 10.0, -0.24593576445134833520); + + /* jn (1, x) == j1 (x) */ + TEST_ff_f (jn, 1, nan_value, nan_value); + TEST_ff_f (jn, 1, plus_infty, 0); + + TEST_ff_f (jn, 1, -1.0, -0.44005058574493351596); + TEST_ff_f (jn, 1, 0.0, 0.0); + TEST_ff_f (jn, 1, 0.1, 0.049937526036241997556); + TEST_ff_f (jn, 1, 0.7, 0.32899574154005894785); + TEST_ff_f (jn, 1, 1.0, 0.44005058574493351596); + TEST_ff_f (jn, 1, 1.5, 0.55793650791009964199); + TEST_ff_f (jn, 1, 2.0, 0.57672480775687338720); + TEST_ff_f (jn, 1, 8.0, 0.23463634685391462438); + TEST_ff_f (jn, 1, 10.0, 0.043472746168861436670); + + /* jn (3, x) */ + TEST_ff_f (jn, 3, nan_value, nan_value); + TEST_ff_f (jn, 3, plus_infty, 0); + + TEST_ff_f (jn, 3, -1.0, -0.019563353982668405919); + TEST_ff_f (jn, 3, 0.0, 0.0); + TEST_ff_f (jn, 3, 0.1, 0.000020820315754756261429); + TEST_ff_f (jn, 3, 0.7, 0.0069296548267508408077); + TEST_ff_f (jn, 3, 1.0, 0.019563353982668405919); + TEST_ff_f (jn, 3, 2.0, 0.12894324947440205110); + TEST_ff_f (jn, 3, 10.0, 0.058379379305186812343); + + /* jn (10, x) */ + TEST_ff_f (jn, 10, nan_value, nan_value); + TEST_ff_f (jn, 10, plus_infty, 0); + + TEST_ff_f (jn, 10, -1.0, 0.26306151236874532070e-9); + TEST_ff_f (jn, 10, 0.0, 0.0); + TEST_ff_f (jn, 10, 0.1, 0.26905328954342155795e-19); + TEST_ff_f (jn, 10, 0.7, 0.75175911502153953928e-11); + TEST_ff_f (jn, 10, 1.0, 0.26306151236874532070e-9); + TEST_ff_f (jn, 10, 2.0, 0.25153862827167367096e-6); + TEST_ff_f (jn, 10, 10.0, 0.20748610663335885770); + + END (jn); +} + + +static void +ldexp_test (void) +{ + TEST_ff_f (ldexp, 0, 0, 0); + TEST_ff_f (ldexp, minus_zero, 0, minus_zero); + + TEST_ff_f (ldexp, plus_infty, 1, plus_infty); + TEST_ff_f (ldexp, minus_infty, 1, minus_infty); + TEST_ff_f (ldexp, nan_value, 1, nan_value); + + TEST_ff_f (ldexp, 0.8L, 4, 12.8L); + TEST_ff_f (ldexp, -0.854375L, 5, -27.34L); + + /* ldexp (x, 0) == x. */ + TEST_ff_f (ldexp, 1.0L, 0L, 1.0L); +} + +static void +lgamma_test (void) +{ + errno = 0; + FUNC(lgamma) (0); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + feclearexcept (FE_ALL_EXCEPT); + + START (lgamma); + + TEST_f_f (lgamma, plus_infty, plus_infty); + TEST_f_f (lgamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + + /* lgamma (x) == +inf plus divide by zero exception for integer x <= 0. */ + TEST_f_f (lgamma, -3, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_f_f (lgamma, minus_infty, plus_infty); + + TEST_f_f1 (lgamma, 1, 0, 1); + + TEST_f_f1 (lgamma, 3, M_LN2l, 1); + + TEST_f_f1 (lgamma, 0.5, M_LOG_SQRT_PIl, 1); + TEST_f_f1 (lgamma, -0.5, M_LOG_2_SQRT_PIl, -1); + TEST_f_f1 (lgamma, 0.7, 0.26086724653166651439L, 1); + TEST_f_f1 (lgamma, 1.2, -0.853740900033158497197e-1L, 1); + + END (lgamma); +} + +static void +lrint_test (void) +{ + /* XXX this test is incomplete. We need to have a way to specifiy + the rounding method and test the critical cases. So far, only + unproblematic numbers are tested. */ + + START (lrint); + + TEST_f_l (lrint, 0.0, 0); + TEST_f_l (lrint, minus_zero, 0); + TEST_f_l (lrint, 0.2, 0); + TEST_f_l (lrint, -0.2, 0); + + TEST_f_l (lrint, 1.4, 1); + TEST_f_l (lrint, -1.4, -1); + + TEST_f_l (lrint, 8388600.3, 8388600); + TEST_f_l (lrint, -8388600.3, -8388600); + + END (lrint); +} + +static void +llrint_test (void) +{ + /* XXX this test is incomplete. We need to have a way to specifiy + the rounding method and test the critical cases. So far, only + unproblematic numbers are tested. */ + + START (llrint); + + TEST_f_L (llrint, 0.0, 0); + TEST_f_L (llrint, minus_zero, 0); + TEST_f_L (llrint, 0.2, 0); + TEST_f_L (llrint, -0.2, 0); + + TEST_f_L (llrint, 1.4, 1); + TEST_f_L (llrint, -1.4, -1); + + TEST_f_L (llrint, 8388600.3, 8388600); + TEST_f_L (llrint, -8388600.3, -8388600); + + /* Test boundary conditions. */ + /* 0x1FFFFF */ + TEST_f_L (llrint, 2097151.0,2097151LL); + /* 0x800000 */ + TEST_f_L (llrint, 8388608.0, 8388608LL); + /* 0x1000000 */ + TEST_f_L (llrint, 16777216.0, 16777216LL); + /* 0x20000000000 */ + TEST_f_L (llrint, 2199023255552.0, 2199023255552LL); + /* 0x40000000000 */ + TEST_f_L (llrint, 4398046511104.0, 4398046511104LL); + /* 0x10000000000000 */ + TEST_f_L (llrint, 4503599627370496.0, 4503599627370496LL); + /* 0x10000080000000 */ + TEST_f_L (llrint, 4503601774854144.0, 4503601774854144LL); + /* 0x20000000000000 */ + TEST_f_L (llrint, 9007199254740992.0, 9007199254740992LL); + /* 0x80000000000000 */ + TEST_f_L (llrint, 36028797018963968.0, 36028797018963968LL); + /* 0x100000000000000 */ + TEST_f_L (llrint, 72057594037927936.0, 72057594037927936LL); + + END (llrint); +} + +static void +log_test (void) +{ + START (log); + + TEST_f_f (log, 0, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_f_f (log, minus_zero, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_f_f (log, 1, 0); + + TEST_f_f (log, -1, nan_value, INVALID_EXCEPTION); + TEST_f_f (log, plus_infty, plus_infty); + + TEST_f_f (log, M_El, 1); + TEST_f_f (log, 1.0 / M_El, -1); + TEST_f_f (log, 2, M_LN2l); + TEST_f_f (log, 10, M_LN10l); + TEST_f_f (log, 0.7, -0.35667494393873237891L); + + END (log); +} + + +static void +log10_test (void) +{ + START (log10); + + TEST_f_f (log10, 0, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_f_f (log10, minus_zero, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_f_f (log10, 1, 0); + + /* log10 (x) == NaN plus invalid exception if x < 0. */ + TEST_f_f (log10, -1, nan_value, INVALID_EXCEPTION); + + TEST_f_f (log10, plus_infty, plus_infty); + + TEST_f_f (log10, 0.1L, -1); + TEST_f_f (log10, 10.0, 1); + TEST_f_f (log10, 100.0, 2); + TEST_f_f (log10, 10000.0, 4); + TEST_f_f (log10, M_El, M_LOG10El); + TEST_f_f (log10, 0.7, -0.15490195998574316929L); + + END (log10); +} + + +static void +log1p_test (void) +{ + START (log1p); + + TEST_f_f (log1p, 0, 0); + TEST_f_f (log1p, minus_zero, minus_zero); + + TEST_f_f (log1p, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_f_f (log1p, -2, nan_value, INVALID_EXCEPTION); + + TEST_f_f (log1p, plus_infty, plus_infty); + + TEST_f_f (log1p, M_El - 1.0, 1); + + TEST_f_f (log1p, -0.3, -0.35667494393873237891L); + + END (log1p); +} + + +static void +log2_test (void) +{ + START (log2); + + TEST_f_f (log2, 0, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_f_f (log2, minus_zero, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_f_f (log2, 1, 0); + + TEST_f_f (log2, -1, nan_value, INVALID_EXCEPTION); + + TEST_f_f (log2, plus_infty, plus_infty); + + TEST_f_f (log2, M_El, M_LOG2El); + TEST_f_f (log2, 2.0, 1); + TEST_f_f (log2, 16.0, 4); + TEST_f_f (log2, 256.0, 8); + TEST_f_f (log2, 0.7, -0.51457317282975824043L); + + END (log2); +} + + +static void +logb_test (void) +{ + START (logb); + + TEST_f_f (logb, plus_infty, plus_infty); + TEST_f_f (logb, minus_infty, plus_infty); + + TEST_f_f (logb, 0, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_f_f (logb, minus_zero, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_f_f (logb, 1, 0); + TEST_f_f (logb, M_El, 1); + TEST_f_f (logb, 1024, 10); + TEST_f_f (logb, -2000, 10); + + END (logb); +} + +static void +lround_test (void) +{ + START (lround); + + TEST_f_l (lround, 0, 0); + TEST_f_l (lround, minus_zero, 0); + TEST_f_l (lround, 0.2, 0.0); + TEST_f_l (lround, -0.2, 0); + TEST_f_l (lround, 0.5, 1); + TEST_f_l (lround, -0.5, -1); + TEST_f_l (lround, 0.8, 1); + TEST_f_l (lround, -0.8, -1); + TEST_f_l (lround, 1.5, 2); + TEST_f_l (lround, -1.5, -2); + TEST_f_l (lround, 22514.5, 22515); + TEST_f_l (lround, -22514.5, -22515); +#ifndef TEST_FLOAT + TEST_f_l (lround, 2097152.5, 2097153); + TEST_f_l (lround, -2097152.5, -2097153); +#endif + END (lround); +} + + +static void +llround_test (void) +{ + START (llround); + + TEST_f_L (llround, 0, 0); + TEST_f_L (llround, minus_zero, 0); + TEST_f_L (llround, 0.2, 0.0); + TEST_f_L (llround, -0.2, 0); + TEST_f_L (llround, 0.5, 1); + TEST_f_L (llround, -0.5, -1); + TEST_f_L (llround, 0.8, 1); + TEST_f_L (llround, -0.8, -1); + TEST_f_L (llround, 1.5, 2); + TEST_f_L (llround, -1.5, -2); + TEST_f_L (llround, 22514.5, 22515); + TEST_f_L (llround, -22514.5, -22515); +#ifndef TEST_FLOAT + TEST_f_L (llround, 2097152.5, 2097153); + TEST_f_L (llround, -2097152.5, -2097153); + TEST_f_L (llround, 34359738368.5, 34359738369ll); + TEST_f_L (llround, -34359738368.5, -34359738369ll); +#endif + + /* Test boundary conditions. */ + /* 0x1FFFFF */ + TEST_f_L (llround, 2097151.0, 2097151LL); + /* 0x800000 */ + TEST_f_L (llround, 8388608.0, 8388608LL); + /* 0x1000000 */ + TEST_f_L (llround, 16777216.0, 16777216LL); + /* 0x20000000000 */ + TEST_f_L (llround, 2199023255552.0, 2199023255552LL); + /* 0x40000000000 */ + TEST_f_L (llround, 4398046511104.0, 4398046511104LL); + /* 0x10000000000000 */ + TEST_f_L (llround, 4503599627370496.0, 4503599627370496LL); + /* 0x10000080000000 */ + TEST_f_L (llrint, 4503601774854144.0, 4503601774854144LL); + /* 0x20000000000000 */ + TEST_f_L (llround, 9007199254740992.0, 9007199254740992LL); + /* 0x80000000000000 */ + TEST_f_L (llround, 36028797018963968.0, 36028797018963968LL); + /* 0x100000000000000 */ + TEST_f_L (llround, 72057594037927936.0, 72057594037927936LL); + + END (llround); +} + +static void +modf_test (void) +{ + FLOAT x; + + START (modf); + + TEST_fF_f1 (modf, plus_infty, 0, plus_infty); + TEST_fF_f1 (modf, minus_infty, minus_zero, minus_infty); + TEST_fF_f1 (modf, nan_value, nan_value, nan_value); + TEST_fF_f1 (modf, 0, 0, 0); + TEST_fF_f1 (modf, 1.5, 0.5, 1); + TEST_fF_f1 (modf, 2.5, 0.5, 2); + TEST_fF_f1 (modf, -2.5, -0.5, -2); + TEST_fF_f1 (modf, 20, 0, 20); + TEST_fF_f1 (modf, 21, 0, 21); + TEST_fF_f1 (modf, 89.5, 0.5, 89); + + END (modf); +} + + +static void +nearbyint_test (void) +{ + START (nearbyint); + + TEST_f_f (nearbyint, 0.0, 0.0); + TEST_f_f (nearbyint, minus_zero, minus_zero); + TEST_f_f (nearbyint, plus_infty, plus_infty); + TEST_f_f (nearbyint, minus_infty, minus_infty); + + END (nearbyint); +} + +static void +nextafter_test (void) +{ + + START (nextafter); + + TEST_ff_f (nextafter, 0, 0, 0); + TEST_ff_f (nextafter, minus_zero, 0, 0); + TEST_ff_f (nextafter, 0, minus_zero, minus_zero); + TEST_ff_f (nextafter, minus_zero, minus_zero, minus_zero); + + TEST_ff_f (nextafter, 9, 9, 9); + TEST_ff_f (nextafter, -9, -9, -9); + TEST_ff_f (nextafter, plus_infty, plus_infty, plus_infty); + TEST_ff_f (nextafter, minus_infty, minus_infty, minus_infty); + + TEST_ff_f (nextafter, nan_value, 1.1, nan_value); + TEST_ff_f (nextafter, 1.1, nan_value, nan_value); + TEST_ff_f (nextafter, nan_value, nan_value, nan_value); + + /* XXX We need the hexadecimal FP number representation here for further + tests. */ + + END (nextafter); +} + +#if 0 +static void +nexttoward_test (void) +{ + START (nexttoward); + TEST_ff_f (nexttoward, 0, 0, 0); + TEST_ff_f (nexttoward, minus_zero, 0, 0); + TEST_ff_f (nexttoward, 0, minus_zero, minus_zero); + TEST_ff_f (nexttoward, minus_zero, minus_zero, minus_zero); + + TEST_ff_f (nexttoward, 9, 9, 9); + TEST_ff_f (nexttoward, -9, -9, -9); + TEST_ff_f (nexttoward, plus_infty, plus_infty, plus_infty); + TEST_ff_f (nexttoward, minus_infty, minus_infty, minus_infty); + + TEST_ff_f (nexttoward, nan_value, 1.1, nan_value); + TEST_ff_f (nexttoward, 1.1, nan_value, nan_value); + TEST_ff_f (nexttoward, nan_value, nan_value, nan_value); + + /* XXX We need the hexadecimal FP number representation here for further + tests. */ + + END (nexttoward); +} +#endif + + +static void +pow_test (void) +{ + + START (pow); + + TEST_ff_f (pow, 0, 0, 1); + TEST_ff_f (pow, 0, minus_zero, 1); + TEST_ff_f (pow, minus_zero, 0, 1); + TEST_ff_f (pow, minus_zero, minus_zero, 1); + + TEST_ff_f (pow, 10, 0, 1); + TEST_ff_f (pow, 10, minus_zero, 1); + TEST_ff_f (pow, -10, 0, 1); + TEST_ff_f (pow, -10, minus_zero, 1); + + TEST_ff_f (pow, nan_value, 0, 1); + TEST_ff_f (pow, nan_value, minus_zero, 1); + + + TEST_ff_f (pow, 1.1, plus_infty, plus_infty); + TEST_ff_f (pow, plus_infty, plus_infty, plus_infty); + TEST_ff_f (pow, -1.1, plus_infty, plus_infty); + TEST_ff_f (pow, minus_infty, plus_infty, plus_infty); + + TEST_ff_f (pow, 0.9L, plus_infty, 0); + TEST_ff_f (pow, 1e-7L, plus_infty, 0); + TEST_ff_f (pow, -0.9L, plus_infty, 0); + TEST_ff_f (pow, -1e-7L, plus_infty, 0); + + TEST_ff_f (pow, 1.1, minus_infty, 0); + TEST_ff_f (pow, plus_infty, minus_infty, 0); + TEST_ff_f (pow, -1.1, minus_infty, 0); + TEST_ff_f (pow, minus_infty, minus_infty, 0); + + TEST_ff_f (pow, 0.9L, minus_infty, plus_infty); + TEST_ff_f (pow, 1e-7L, minus_infty, plus_infty); + TEST_ff_f (pow, -0.9L, minus_infty, plus_infty); + TEST_ff_f (pow, -1e-7L, minus_infty, plus_infty); + + TEST_ff_f (pow, plus_infty, 1e-7L, plus_infty); + TEST_ff_f (pow, plus_infty, 1, plus_infty); + TEST_ff_f (pow, plus_infty, 1e7L, plus_infty); + + TEST_ff_f (pow, plus_infty, -1e-7L, 0); + TEST_ff_f (pow, plus_infty, -1, 0); + TEST_ff_f (pow, plus_infty, -1e7L, 0); + + TEST_ff_f (pow, minus_infty, 1, minus_infty); + TEST_ff_f (pow, minus_infty, 11, minus_infty); + TEST_ff_f (pow, minus_infty, 1001, minus_infty); + + TEST_ff_f (pow, minus_infty, 2, plus_infty); + TEST_ff_f (pow, minus_infty, 12, plus_infty); + TEST_ff_f (pow, minus_infty, 1002, plus_infty); + TEST_ff_f (pow, minus_infty, 0.1, plus_infty); + TEST_ff_f (pow, minus_infty, 1.1, plus_infty); + TEST_ff_f (pow, minus_infty, 11.1, plus_infty); + TEST_ff_f (pow, minus_infty, 1001.1, plus_infty); + + TEST_ff_f (pow, minus_infty, -1, minus_zero); + TEST_ff_f (pow, minus_infty, -11, minus_zero); + TEST_ff_f (pow, minus_infty, -1001, minus_zero); + + TEST_ff_f (pow, minus_infty, -2, 0); + TEST_ff_f (pow, minus_infty, -12, 0); + TEST_ff_f (pow, minus_infty, -1002, 0); + TEST_ff_f (pow, minus_infty, -0.1, 0); + TEST_ff_f (pow, minus_infty, -1.1, 0); + TEST_ff_f (pow, minus_infty, -11.1, 0); + TEST_ff_f (pow, minus_infty, -1001.1, 0); + + TEST_ff_f (pow, nan_value, nan_value, nan_value); + TEST_ff_f (pow, 0, nan_value, nan_value); + TEST_ff_f (pow, 1, nan_value, nan_value); + TEST_ff_f (pow, -1, nan_value, nan_value); + TEST_ff_f (pow, nan_value, 1, nan_value); + TEST_ff_f (pow, nan_value, -1, nan_value); + + /* pow (x, NaN) == NaN. */ + TEST_ff_f (pow, 3.0, nan_value, nan_value); + + TEST_ff_f (pow, 1, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_ff_f (pow, -1, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_ff_f (pow, 1, minus_infty, nan_value, INVALID_EXCEPTION); + TEST_ff_f (pow, -1, minus_infty, nan_value, INVALID_EXCEPTION); + + TEST_ff_f (pow, -0.1, 1.1, nan_value, INVALID_EXCEPTION); + TEST_ff_f (pow, -0.1, -1.1, nan_value, INVALID_EXCEPTION); + TEST_ff_f (pow, -10.1, 1.1, nan_value, INVALID_EXCEPTION); + TEST_ff_f (pow, -10.1, -1.1, nan_value, INVALID_EXCEPTION); + + TEST_ff_f (pow, 0, -1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_ff_f (pow, 0, -11, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_ff_f (pow, minus_zero, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_ff_f (pow, minus_zero, -11, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); + + TEST_ff_f (pow, 0, -2, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_ff_f (pow, 0, -11.1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_ff_f (pow, minus_zero, -2, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + TEST_ff_f (pow, minus_zero, -11.1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION); + + + TEST_ff_f (pow, 0, 1, 0); + TEST_ff_f (pow, 0, 11, 0); + + TEST_ff_f (pow, minus_zero, 1, minus_zero); + TEST_ff_f (pow, minus_zero, 11, minus_zero); + + + TEST_ff_f (pow, 0, 2, 0); + TEST_ff_f (pow, 0, 11.1, 0); + + + TEST_ff_f (pow, minus_zero, 2, 0); + TEST_ff_f (pow, minus_zero, 11.1, 0); + + /* pow (x, +inf) == +inf for |x| > 1. */ + TEST_ff_f (pow, 1.5, plus_infty, plus_infty); + + /* pow (x, +inf) == +0 for |x| < 1. */ + TEST_ff_f (pow, 0.5, plus_infty, 0.0); + + /* pow (x, -inf) == +0 for |x| > 1. */ + TEST_ff_f (pow, 1.5, minus_infty, 0.0); + + /* pow (x, -inf) == +inf for |x| < 1. */ + TEST_ff_f (pow, 0.5, minus_infty, plus_infty); + + /* pow (+inf, y) == +inf for y > 0. */ + TEST_ff_f (pow, plus_infty, 2, plus_infty); + + /* pow (+inf, y) == +0 for y < 0. */ + TEST_ff_f (pow, plus_infty, -1, 0.0); + + /* pow (-inf, y) == -inf for y an odd integer > 0. */ + TEST_ff_f (pow, minus_infty, 27, minus_infty); + + /* pow (-inf, y) == +inf for y > 0 and not an odd integer. */ + TEST_ff_f (pow, minus_infty, 28, plus_infty); + + /* pow (-inf, y) == -0 for y an odd integer < 0. */ + TEST_ff_f (pow, minus_infty, -3, minus_zero); + /* pow (-inf, y) == +0 for y < 0 and not an odd integer. */ + TEST_ff_f (pow, minus_infty, -2.0, 0.0); + + /* pow (+0, y) == +0 for y an odd integer > 0. */ + TEST_ff_f (pow, 0.0, 27, 0.0); + + /* pow (-0, y) == -0 for y an odd integer > 0. */ + TEST_ff_f (pow, minus_zero, 27, minus_zero); + + /* pow (+0, y) == +0 for y > 0 and not an odd integer. */ + TEST_ff_f (pow, 0.0, 4, 0.0); + + /* pow (-0, y) == +0 for y > 0 and not an odd integer. */ + TEST_ff_f (pow, minus_zero, 4, 0.0); + + TEST_ff_f (pow, 0.7, 1.2, 0.65180494056638638188L); + +#ifdef TEST_DOUBLE + TEST_ff_f (pow, -7.49321e+133, -9.80818e+16, 0); +#endif + + END (pow); +} + +static void +remainder_test (void) +{ + + START (remainder); + + TEST_ff_f (remainder, 1, 0, nan_value, INVALID_EXCEPTION); + TEST_ff_f (remainder, 1, minus_zero, nan_value, INVALID_EXCEPTION); + TEST_ff_f (remainder, plus_infty, 1, nan_value, INVALID_EXCEPTION); + TEST_ff_f (remainder, minus_infty, 1, nan_value, INVALID_EXCEPTION); + + TEST_ff_f (remainder, 1.625, 1.0, -0.375); + TEST_ff_f (remainder, -1.625, 1.0, 0.375); + TEST_ff_f (remainder, 1.625, -1.0, -0.375); + TEST_ff_f (remainder, -1.625, -1.0, 0.375); + TEST_ff_f (remainder, 5.0, 2.0, 1.0); + TEST_ff_f (remainder, 3.0, 2.0, -1.0); + + END (remainder); +} + +static void +remquo_test (void) +{ + /* x is needed. */ + int x; + + START (remquo); + + TEST_ffI_f1 (remquo, 1, 0, nan_value, IGNORE, INVALID_EXCEPTION); + TEST_ffI_f1 (remquo, 1, minus_zero, nan_value, IGNORE, INVALID_EXCEPTION); + TEST_ffI_f1 (remquo, plus_infty, 1, nan_value, IGNORE, INVALID_EXCEPTION); + TEST_ffI_f1 (remquo, minus_infty, 1, nan_value, IGNORE, INVALID_EXCEPTION); + + TEST_ffI_f1 (remquo, 1.625, 1.0, -0.375, 2); + TEST_ffI_f1 (remquo, -1.625, 1.0, 0.375, -2); + TEST_ffI_f1 (remquo, 1.625, -1.0, -0.375, -2); + TEST_ffI_f1 (remquo, -1.625, -1.0, 0.375, 2); + + TEST_ffI_f1 (remquo, 5, 2, 1, 2); + TEST_ffI_f1 (remquo, 3, 2, -1, 2); + + END (remquo); +} + +static void +rint_test (void) +{ + START (rint); + + TEST_f_f (rint, 0.0, 0.0); + TEST_f_f (rint, minus_zero, minus_zero); + TEST_f_f (rint, plus_infty, plus_infty); + TEST_f_f (rint, minus_infty, minus_infty); + + END (rint); +} + +static void +round_test (void) +{ + START (round); + + TEST_f_f (round, 0, 0); + TEST_f_f (round, minus_zero, minus_zero); + TEST_f_f (round, 0.2, 0.0); + TEST_f_f (round, -0.2, minus_zero); + TEST_f_f (round, 0.5, 1.0); + TEST_f_f (round, -0.5, -1.0); + TEST_f_f (round, 0.8, 1.0); + TEST_f_f (round, -0.8, -1.0); + TEST_f_f (round, 1.5, 2.0); + TEST_f_f (round, -1.5, -2.0); + TEST_f_f (round, 2097152.5, 2097153); + TEST_f_f (round, -2097152.5, -2097153); + + END (round); +} + + +static void +scalb_test (void) +{ + + START (scalb); + + TEST_ff_f (scalb, 2.0, 0.5, nan_value); + TEST_ff_f (scalb, 3.0, -2.5, nan_value); + + TEST_ff_f (scalb, 0, nan_value, nan_value); + TEST_ff_f (scalb, 1, nan_value, nan_value); + + TEST_ff_f (scalb, 1, 0, 1); + TEST_ff_f (scalb, -1, 0, -1); + + TEST_ff_f (scalb, 0, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_ff_f (scalb, minus_zero, plus_infty, nan_value, INVALID_EXCEPTION); + + TEST_ff_f (scalb, 0, 2, 0); + TEST_ff_f (scalb, minus_zero, -4, minus_zero); + TEST_ff_f (scalb, 0, 0, 0); + TEST_ff_f (scalb, minus_zero, 0, minus_zero); + TEST_ff_f (scalb, 0, -1, 0); + TEST_ff_f (scalb, minus_zero, -10, minus_zero); + TEST_ff_f (scalb, 0, minus_infty, 0); + TEST_ff_f (scalb, minus_zero, minus_infty, minus_zero); + + TEST_ff_f (scalb, plus_infty, -1, plus_infty); + TEST_ff_f (scalb, minus_infty, -10, minus_infty); + TEST_ff_f (scalb, plus_infty, 0, plus_infty); + TEST_ff_f (scalb, minus_infty, 0, minus_infty); + TEST_ff_f (scalb, plus_infty, 2, plus_infty); + TEST_ff_f (scalb, minus_infty, 100, minus_infty); + + TEST_ff_f (scalb, 0.1, minus_infty, 0.0); + TEST_ff_f (scalb, -0.1, minus_infty, minus_zero); + + TEST_ff_f (scalb, 1, plus_infty, plus_infty); + TEST_ff_f (scalb, -1, plus_infty, minus_infty); + TEST_ff_f (scalb, plus_infty, plus_infty, plus_infty); + TEST_ff_f (scalb, minus_infty, plus_infty, minus_infty); + + TEST_ff_f (scalb, plus_infty, minus_infty, nan_value); + TEST_ff_f (scalb, minus_infty, minus_infty, nan_value); + + TEST_ff_f (scalb, nan_value, 1, nan_value); + TEST_ff_f (scalb, 1, nan_value, nan_value); + TEST_ff_f (scalb, nan_value, 0, nan_value); + TEST_ff_f (scalb, 0, nan_value, nan_value); + TEST_ff_f (scalb, nan_value, plus_infty, nan_value); + TEST_ff_f (scalb, plus_infty, nan_value, nan_value); + TEST_ff_f (scalb, nan_value, nan_value, nan_value); + + TEST_ff_f (scalb, 0.8L, 4, 12.8L); + TEST_ff_f (scalb, -0.854375L, 5, -27.34L); + + END (scalb); +} + + +static void +scalbn_test (void) +{ + + START (scalbn); + + TEST_fi_f (scalbn, 0, 0, 0); + TEST_fi_f (scalbn, minus_zero, 0, minus_zero); + + TEST_fi_f (scalbn, plus_infty, 1, plus_infty); + TEST_fi_f (scalbn, minus_infty, 1, minus_infty); + TEST_fi_f (scalbn, nan_value, 1, nan_value); + + TEST_fi_f (scalbn, 0.8L, 4, 12.8L); + TEST_fi_f (scalbn, -0.854375L, 5, -27.34L); + + TEST_fi_f (scalbn, 1, 0L, 1); + + END (scalbn); +} + +static void +scalbln_test (void) +{ + + START (scalbln); + + TEST_fl_f (scalbln, 0, 0, 0); + TEST_fl_f (scalbln, minus_zero, 0, minus_zero); + + TEST_fl_f (scalbln, plus_infty, 1, plus_infty); + TEST_fl_f (scalbln, minus_infty, 1, minus_infty); + TEST_fl_f (scalbln, nan_value, 1, nan_value); + + TEST_fl_f (scalbln, 0.8L, 4, 12.8L); + TEST_fl_f (scalbln, -0.854375L, 5, -27.34L); + + TEST_fl_f (scalbln, 1, 0L, 1); + + END (scalbn); +} + +static void +signbit_test (void) +{ + + START (signbit); + + TEST_f_b (signbit, 0, 0); + TEST_f_b (signbit, minus_zero, 1); + TEST_f_b (signbit, plus_infty, 0); + TEST_f_b (signbit, minus_infty, 1); + + /* signbit (x) != 0 for x < 0. */ + TEST_f_b (signbit, -1, 1); + /* signbit (x) == 0 for x >= 0. */ + TEST_f_b (signbit, 1, 0); + + END (signbit); +} + +static void +sin_test (void) +{ + START (sin); + + TEST_f_f (sin, 0, 0); + TEST_f_f (sin, minus_zero, minus_zero); + TEST_f_f (sin, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_f_f (sin, minus_infty, nan_value, INVALID_EXCEPTION); + + TEST_f_f (sin, M_PI_6l, 0.5); + TEST_f_f (sin, -M_PI_6l, -0.5); + TEST_f_f (sin, M_PI_2l, 1); + TEST_f_f (sin, -M_PI_2l, -1); + TEST_f_f (sin, 0.7, 0.64421768723769105367L); + + END (sin); + +} + +static void +sincos_test (void) +{ + FLOAT sin_res, cos_res; + + START (sincos); + + /* sincos is treated differently because it returns void. */ + TEST_extra (sincos, 0, 0, 1); + + TEST_extra (sincos, minus_zero, minus_zero, 1); + TEST_extra (sincos, plus_infty, nan_value, nan_value, INVALID_EXCEPTION); + TEST_extra (sincos, minus_infty, nan_value, nan_value, INVALID_EXCEPTION); + + TEST_extra (sincos, M_PI_2l, 1, 0); + TEST_extra (sincos, M_PI_6l, 0.5, 0.866025403784438646764L); + TEST_extra (sincos, M_PI_6l*2.0, 0.866025403784438646764L, 0.5); + TEST_extra (sincos, 0.7, 0.64421768723769105367L, 0.76484218728448842626L); + + END (sincos); +} + +static void +sinh_test (void) +{ + START (sinh); + TEST_f_f (sinh, 0, 0); + TEST_f_f (sinh, minus_zero, minus_zero); + + TEST_f_f (sinh, plus_infty, plus_infty); + TEST_f_f (sinh, minus_infty, minus_infty); + + TEST_f_f (sinh, 0.7, 0.75858370183953350346L); + + END (sinh); +} + +static void +sqrt_test (void) +{ + START (sqrt); + + TEST_f_f (sqrt, 0, 0); + TEST_f_f (sqrt, nan_value, nan_value); + TEST_f_f (sqrt, plus_infty, plus_infty); + + TEST_f_f (sqrt, minus_zero, minus_zero); + + /* sqrt (x) == NaN plus invalid exception for x < 0. */ + TEST_f_f (sqrt, -1, nan_value, INVALID_EXCEPTION); + TEST_f_f (sqrt, minus_infty, nan_value, INVALID_EXCEPTION); + + TEST_f_f (sqrt, 2209, 47); + TEST_f_f (sqrt, 4, 2); + TEST_f_f (sqrt, 2, M_SQRT2l); + TEST_f_f (sqrt, 0.25, 0.5); + TEST_f_f (sqrt, 6642.25, 81.5); + TEST_f_f (sqrt, 15239.9025, 123.45); + TEST_f_f (sqrt, 0.7, 0.83666002653407554798L); + + END (sqrt); +} + +static void +tan_test (void) +{ + START (tan); + + TEST_f_f (tan, 0, 0); + TEST_f_f (tan, minus_zero, minus_zero); + TEST_f_f (tan, plus_infty, nan_value, INVALID_EXCEPTION); + TEST_f_f (tan, minus_infty, nan_value, INVALID_EXCEPTION); + + TEST_f_f (tan, M_PI_4l, 1); + TEST_f_f (tan, 0.7, 0.84228838046307944813L); + + END (tan); +} + +static void +tanh_test (void) +{ + START (tanh); + + TEST_f_f (tanh, 0, 0); + TEST_f_f (tanh, minus_zero, minus_zero); + + TEST_f_f (tanh, plus_infty, 1); + TEST_f_f (tanh, minus_infty, -1); + + TEST_f_f (tanh, 0.7, 0.60436777711716349631L); + + END (tanh); +} + +static void +tgamma_test (void) +{ + errno = 0; + FUNC(tgamma) (1); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + feclearexcept (FE_ALL_EXCEPT); + + START (tgamma); + + TEST_f_f (tgamma, plus_infty, plus_infty); + TEST_f_f (tgamma, 0, nan_value, INVALID_EXCEPTION); + TEST_f_f (tgamma, minus_zero, nan_value, INVALID_EXCEPTION); + /* tgamma (x) == NaN plus invalid exception for integer x <= 0. */ + TEST_f_f (tgamma, -2, nan_value, INVALID_EXCEPTION); + TEST_f_f (tgamma, minus_infty, nan_value, INVALID_EXCEPTION); + + TEST_f_f (tgamma, 0.5, M_SQRT_PIl); + TEST_f_f (tgamma, -0.5, -M_2_SQRT_PIl); + + TEST_f_f (tgamma, 1, 1); + TEST_f_f (tgamma, 4, 6); + + TEST_f_f (tgamma, 0.7, 1.29805533264755778568L); + TEST_f_f (tgamma, 1.2, 0.91816874239976061064L); + + END (tgamma); +} + +static void +trunc_test (void) +{ + START (trunc); + + TEST_f_f (trunc, plus_infty, plus_infty); + TEST_f_f (trunc, minus_infty, minus_infty); + TEST_f_f (trunc, nan_value, nan_value); + + TEST_f_f (trunc, 0, 0); + TEST_f_f (trunc, minus_zero, minus_zero); + TEST_f_f (trunc, 0.625, 0); + TEST_f_f (trunc, -0.625, minus_zero); + TEST_f_f (trunc, 1, 1); + TEST_f_f (trunc, -1, -1); + TEST_f_f (trunc, 1.625, 1); + TEST_f_f (trunc, -1.625, -1); + + TEST_f_f (trunc, 1048580.625L, 1048580L); + TEST_f_f (trunc, -1048580.625L, -1048580L); + + TEST_f_f (trunc, 8388610.125L, 8388610.0L); + TEST_f_f (trunc, -8388610.125L, -8388610.0L); + + TEST_f_f (trunc, 4294967296.625L, 4294967296.0L); + TEST_f_f (trunc, -4294967296.625L, -4294967296.0L); + + + END (trunc); +} + +static void +y0_test (void) +{ + errno = 0; + FUNC(y0) (1); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + /* y0 is the Bessel function of the second kind of order 0 */ + START (y0); + + TEST_f_f (y0, -1.0, minus_infty); + TEST_f_f (y0, 0.0, minus_infty); + TEST_f_f (y0, nan_value, nan_value); + TEST_f_f (y0, plus_infty, 0); + + TEST_f_f (y0, 0.1, -1.5342386513503668441); + TEST_f_f (y0, 0.7, -0.19066492933739506743); + TEST_f_f (y0, 1.0, 0.088256964215676957983); + TEST_f_f (y0, 1.5, 0.38244892379775884396); + TEST_f_f (y0, 2.0, 0.51037567264974511960); + TEST_f_f (y0, 8.0, 0.22352148938756622053); + TEST_f_f (y0, 10.0, 0.055671167283599391424); + + END (y0); +} + + +static void +y1_test (void) +{ + errno = 0; + FUNC(y1) (1); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + /* y1 is the Bessel function of the second kind of order 1 */ + START (y1); + + TEST_f_f (y1, -1.0, minus_infty); + TEST_f_f (y1, 0.0, minus_infty); + TEST_f_f (y1, plus_infty, 0); + TEST_f_f (y1, nan_value, nan_value); + + TEST_f_f (y1, 0.1, -6.4589510947020269877); + TEST_f_f (y1, 0.7, -1.1032498719076333697); + TEST_f_f (y1, 1.0, -0.78121282130028871655); + TEST_f_f (y1, 1.5, -0.41230862697391129595); + TEST_f_f (y1, 2.0, -0.10703243154093754689); + TEST_f_f (y1, 8.0, -0.15806046173124749426); + TEST_f_f (y1, 10.0, 0.24901542420695388392); + + END (y1); +} + +static void +yn_test (void) +{ + errno = 0; + FUNC(yn) (1, 1); + if (errno == ENOSYS) + /* Function not implemented. */ + return; + + /* yn is the Bessel function of the second kind of order n */ + START (yn); + + /* yn (0, x) == y0 (x) */ + TEST_ff_f (yn, 0, -1.0, minus_infty); + TEST_ff_f (yn, 0, 0.0, minus_infty); + TEST_ff_f (yn, 0, nan_value, nan_value); + TEST_ff_f (yn, 0, plus_infty, 0); + + TEST_ff_f (yn, 0, 0.1, -1.5342386513503668441); + TEST_ff_f (yn, 0, 0.7, -0.19066492933739506743); + TEST_ff_f (yn, 0, 1.0, 0.088256964215676957983); + TEST_ff_f (yn, 0, 1.5, 0.38244892379775884396); + TEST_ff_f (yn, 0, 2.0, 0.51037567264974511960); + TEST_ff_f (yn, 0, 8.0, 0.22352148938756622053); + TEST_ff_f (yn, 0, 10.0, 0.055671167283599391424); + + /* yn (1, x) == y1 (x) */ + TEST_ff_f (yn, 1, -1.0, minus_infty); + TEST_ff_f (yn, 1, 0.0, minus_infty); + TEST_ff_f (yn, 1, plus_infty, 0); + TEST_ff_f (yn, 1, nan_value, nan_value); + + TEST_ff_f (yn, 1, 0.1, -6.4589510947020269877); + TEST_ff_f (yn, 1, 0.7, -1.1032498719076333697); + TEST_ff_f (yn, 1, 1.0, -0.78121282130028871655); + TEST_ff_f (yn, 1, 1.5, -0.41230862697391129595); + TEST_ff_f (yn, 1, 2.0, -0.10703243154093754689); + TEST_ff_f (yn, 1, 8.0, -0.15806046173124749426); + TEST_ff_f (yn, 1, 10.0, 0.24901542420695388392); + + /* yn (3, x) */ + TEST_ff_f (yn, 3, plus_infty, 0); + TEST_ff_f (yn, 3, nan_value, nan_value); + + TEST_ff_f (yn, 3, 0.1, -5099.3323786129048894); + TEST_ff_f (yn, 3, 0.7, -15.819479052819633505); + TEST_ff_f (yn, 3, 1.0, -5.8215176059647288478); + TEST_ff_f (yn, 3, 2.0, -1.1277837768404277861); + TEST_ff_f (yn, 3, 10.0, -0.25136265718383732978); + + /* yn (10, x) */ + TEST_ff_f (yn, 10, plus_infty, 0); + TEST_ff_f (yn, 10, nan_value, nan_value); + + TEST_ff_f (yn, 10, 0.1, -0.11831335132045197885e19); + TEST_ff_f (yn, 10, 0.7, -0.42447194260703866924e10); + TEST_ff_f (yn, 10, 1.0, -0.12161801427868918929e9); + TEST_ff_f (yn, 10, 2.0, -129184.54220803928264); + TEST_ff_f (yn, 10, 10.0, -0.35981415218340272205); + + END (yn); + +} + + + +static void +initialize (void) +{ + fpstack_test ("start *init*"); + plus_zero = 0.0; + nan_value = plus_zero / plus_zero; /* Suppress GCC warning */ + + minus_zero = FUNC(copysign) (0.0, -1.0); + plus_infty = CHOOSE (HUGE_VALL, HUGE_VAL, HUGE_VALF, + HUGE_VALL, HUGE_VAL, HUGE_VALF); + minus_infty = CHOOSE (-HUGE_VALL, -HUGE_VAL, -HUGE_VALF, + -HUGE_VALL, -HUGE_VAL, -HUGE_VALF); + + (void) &plus_zero; + (void) &nan_value; + (void) &minus_zero; + (void) &plus_infty; + (void) &minus_infty; + + /* Clear all exceptions. From now on we must not get random exceptions. */ + feclearexcept (FE_ALL_EXCEPT); + + /* Test to make sure we start correctly. */ + fpstack_test ("end *init*"); +} + +/* Definitions of arguments for argp functions. */ +static const struct argp_option options[] = +{ + { "verbose", 'v', "NUMBER", 0, "Level of verbosity (0..3)"}, + { "ulps-file", 'u', NULL, 0, "Output ulps to file ULPs"}, + { "no-max-error", 'f', NULL, 0, + "Don't output maximal errors of functions"}, + { "no-points", 'p', NULL, 0, + "Don't output results of functions invocations"}, + { NULL, 0, NULL, 0, NULL } +}; + +/* Short description of program. */ +static const char doc[] = "Math test suite: " TEST_MSG ; + +/* Prototype for option handler. */ +static error_t parse_opt __P ((int key, char *arg, struct argp_state *state)); + +/* Data structure to communicate with argp functions. */ +static struct argp argp = +{ + options, parse_opt, NULL, doc, +}; + + +/* Handle program arguments. */ +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case 'f': + output_points = 0; + break; + case 'p': + output_max_error = 0; + break; + case 'u': + output_ulps = 1; + break; + case 'v': + if (optarg) + verbose = (unsigned int) strtoul (optarg, NULL, 0); + else + verbose = 3; + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +#if 0 +/* function to check our ulp calculation. */ +void +check_ulp (void) +{ + int i; + + FLOAT u, diff, ulp; + /* This gives one ulp. */ + u = FUNC(nextafter) (10, 20); + check_equal (10.0, u, 1, &diff, &ulp); + printf ("One ulp: % .4" PRINTF_NEXPR "\n", ulp); + + /* This gives one more ulp. */ + u = FUNC(nextafter) (u, 20); + check_equal (10.0, u, 2, &diff, &ulp); + printf ("two ulp: % .4" PRINTF_NEXPR "\n", ulp); + + /* And now calculate 100 ulp. */ + for (i = 2; i < 100; i++) + u = FUNC(nextafter) (u, 20); + check_equal (10.0, u, 100, &diff, &ulp); + printf ("100 ulp: % .4" PRINTF_NEXPR "\n", ulp); +} +#endif + +int +main (int argc, char **argv) +{ + + int remaining; + + verbose = 1; + output_ulps = 0; + output_max_error = 1; + output_points = 1; + + /* Parse and process arguments. */ + argp_parse (&argp, argc, argv, 0, &remaining, NULL); + + if (remaining != argc) + { + fprintf (stderr, "wrong number of arguments"); + argp_help (&argp, stdout, ARGP_HELP_SEE, program_invocation_short_name); + exit (EXIT_FAILURE); + } + + if (output_ulps) + { + ulps_file = fopen ("ULPs", "a"); + if (ulps_file == NULL) + { + perror ("can't open file `ULPs' for writing: "); + exit (1); + } + } + + + initialize (); + printf (TEST_MSG); + +#if 0 + check_ulp (); +#endif + + /* Keep the tests a wee bit ordered (according to ISO 9X). */ + /* Classification macros: */ + fpclassify_test (); + isfinite_test (); + isnormal_test (); + signbit_test (); + + /* Trigonometric functions: */ + acos_test (); + asin_test (); + atan_test (); + atan2_test (); + cos_test (); + sin_test (); + sincos_test (); + tan_test (); + + /* Hyperbolic functions: */ + acosh_test (); + asinh_test (); + atanh_test (); + cosh_test (); + sinh_test (); + tanh_test (); + + /* Exponential and logarithmic functions: */ + exp_test (); + exp10_test (); + exp2_test (); + expm1_test (); + frexp_test (); + ldexp_test (); + log_test (); + log10_test (); + log1p_test (); + log2_test (); + logb_test (); + modf_test (); + ilogb_test (); + scalb_test (); + scalbn_test (); + scalbln_test (); + + /* Power and absolute value functions: */ + cbrt_test (); + fabs_test (); + hypot_test (); + pow_test (); + sqrt_test (); + + /* Error and gamma functions: */ + erf_test (); + erfc_test (); + gamma_test (); + lgamma_test (); + tgamma_test (); + + /* Nearest integer functions: */ + ceil_test (); + floor_test (); + nearbyint_test (); + rint_test (); + lrint_test (); + llrint_test (); + round_test (); + lround_test (); + llround_test (); + trunc_test (); + + /* Remainder functions: */ + fmod_test (); + remainder_test (); + remquo_test (); + + /* Manipulation functions: */ + copysign_test (); + nextafter_test (); + // nexttoward_test (); + + /* maximum, minimum and positive difference functions */ + fdim_test (); + fmax_test (); + fmin_test (); + + /* Multiply and add: */ + fma_test (); + + /* Complex functions: */ + cabs_test (); + cacos_test (); + cacosh_test (); + carg_test (); + casin_test (); + casinh_test (); + catan_test (); + catanh_test (); + ccos_test (); + ccosh_test (); + cexp_test (); + clog10_test (); + clog_test (); + cpow_test (); + cproj_test (); + csin_test (); + csinh_test (); + csqrt_test (); + ctan_test (); + ctanh_test (); + + /* Bessel functions: */ + j0_test (); + j1_test (); + jn_test (); + y0_test (); + y1_test (); + yn_test (); + + if (output_ulps) + fclose (ulps_file); + + printf ("\nTest suite completed:\n"); + printf (" %d test cases plus %d tests for exception flags executed.\n", + noTests, noExcTests); + if (noXFails) + printf (" %d expected failures occured.\n", noXFails); + if (noXPasses) + printf (" %d unexpected passes occured.\n", noXPasses); + if (noErrors) + { + printf (" %d errors occured.\n", noErrors); + exit (1); + } + printf (" All tests passed successfully.\n"); + exit (0); +} + +/* + * Local Variables: + * mode:c + * End: + */ diff --git a/math/test-double.c b/math/test-double.c index 4769f4e754..6f917a024f 100644 --- a/math/test-double.c +++ b/math/test-double.c @@ -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 , 1997. + Contributed by Andreas Jaeger , 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 diff --git a/math/test-float.c b/math/test-float.c index 04027738a9..e72bc37532 100644 --- a/math/test-float.c +++ b/math/test-float.c @@ -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 , 1997. + Contributed by Andreas Jaeger , 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 diff --git a/math/test-idouble.c b/math/test-idouble.c index 14bfb9241e..390249d3bc 100644 --- a/math/test-idouble.c +++ b/math/test-idouble.c @@ -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 , 1997. + Contributed by Andreas Jaeger , 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 diff --git a/math/test-ifloat.c b/math/test-ifloat.c index a45a54d335..99ae51a1e5 100644 --- a/math/test-ifloat.c +++ b/math/test-ifloat.c @@ -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 , 1997. + Contributed by Andreas Jaeger , 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 diff --git a/math/test-ildoubl.c b/math/test-ildoubl.c index 3947cf14cf..4d0780ed6f 100644 --- a/math/test-ildoubl.c +++ b/math/test-ildoubl.c @@ -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 , 1997. + Contributed by Andreas Jaeger , 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 diff --git a/math/test-ldouble.c b/math/test-ldouble.c index c516c973ba..8401f2da17 100644 --- a/math/test-ldouble.c +++ b/math/test-ldouble.c @@ -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 , 1997. + Contributed by Andreas Jaeger , 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 diff --git a/sysdeps/generic/libm-test-ulps b/sysdeps/generic/libm-test-ulps new file mode 100644 index 0000000000..7cfa1f8285 --- /dev/null +++ b/sysdeps/generic/libm-test-ulps @@ -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'. diff --git a/sysdeps/i386/libm-test-ulps b/sysdeps/i386/libm-test-ulps new file mode 100644 index 0000000000..07c59640fd --- /dev/null +++ b/sysdeps/i386/libm-test-ulps @@ -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