1999-10-29 17:38:14 +00:00
|
|
|
#!/usr/bin/perl -w
|
2016-01-04 16:05:18 +00:00
|
|
|
# Copyright (C) 1999-2016 Free Software Foundation, Inc.
|
1999-10-29 17:38:14 +00:00
|
|
|
# This file is part of the GNU C Library.
|
|
|
|
# Contributed by Andreas Jaeger <aj@suse.de>, 1999.
|
|
|
|
|
|
|
|
# The GNU C Library is free software; you can redistribute it and/or
|
2001-07-06 04:58:11 +00:00
|
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
|
|
# License as published by the Free Software Foundation; either
|
|
|
|
# version 2.1 of the License, or (at your option) any later version.
|
1999-10-29 17:38:14 +00:00
|
|
|
|
|
|
|
# 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
|
2001-07-06 04:58:11 +00:00
|
|
|
# Lesser General Public License for more details.
|
1999-10-29 17:38:14 +00:00
|
|
|
|
2001-07-06 04:58:11 +00:00
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
2012-02-09 23:18:22 +00:00
|
|
|
# License along with the GNU C Library; if not, see
|
|
|
|
# <http://www.gnu.org/licenses/>.
|
1999-10-29 17:38:14 +00:00
|
|
|
|
|
|
|
# Information about tests are stored in: %results
|
|
|
|
# $results{$test}{"type"} is the result type, e.g. normal or complex.
|
|
|
|
# In the following description $platform, $type and $float are:
|
|
|
|
# - $platform is the used platform
|
|
|
|
# - $type is either "normal", "real" (for the real part of a complex number)
|
|
|
|
# or "imag" (for the imaginary part # of a complex number).
|
|
|
|
# - $float is either of float, ifloat, double, idouble, ldouble, ildouble;
|
|
|
|
# It represents the underlying floating point type (float, double or long
|
|
|
|
# double) and if inline functions (the leading i stands for inline)
|
|
|
|
# are used.
|
|
|
|
# $results{$test}{$platform}{$type}{$float} is defined and has a delta
|
|
|
|
# or 'fail' as value.
|
|
|
|
|
|
|
|
use File::Find;
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
use vars qw ($sources @platforms %pplatforms);
|
|
|
|
use vars qw (%results @all_floats %suffices @all_functions);
|
|
|
|
|
|
|
|
|
|
|
|
# all_floats is in output order and contains all recognised float types that
|
|
|
|
# we're going to output
|
|
|
|
@all_floats = ('float', 'double', 'ldouble');
|
|
|
|
%suffices =
|
|
|
|
( 'float' => 'f',
|
|
|
|
'double' => '',
|
|
|
|
'ldouble' => 'l'
|
|
|
|
);
|
|
|
|
|
|
|
|
# Pretty description of platform
|
2016-11-04 16:49:06 +00:00
|
|
|
%pplatforms = ();
|
1999-10-29 17:38:14 +00:00
|
|
|
|
2001-08-28 08:05:41 +00:00
|
|
|
@all_functions =
|
1999-10-29 17:38:14 +00:00
|
|
|
( "acos", "acosh", "asin", "asinh", "atan", "atanh",
|
|
|
|
"atan2", "cabs", "cacos", "cacosh", "carg", "casin", "casinh",
|
|
|
|
"catan", "catanh", "cbrt", "ccos", "ccosh", "ceil", "cexp", "cimag",
|
|
|
|
"clog", "clog10", "conj", "copysign", "cos", "cosh", "cpow", "cproj",
|
|
|
|
"creal", "csin", "csinh", "csqrt", "ctan", "ctanh", "erf", "erfc",
|
|
|
|
"exp", "exp10", "exp2", "expm1", "fabs", "fdim", "floor", "fma",
|
2016-12-20 00:46:53 +00:00
|
|
|
"fmax", "fmaxmag", "fmin", "fminmag", "fmod", "frexp", "gamma", "hypot",
|
Add llogb, llogbf, llogbl.
TS 18661-1 defines llogb functions that are like ilogb except that
they return long int instead of int. Corresponding FP_LLOGB* macros
are defined, whose values are required to have the obvious
correspondence to those of the FP_ILOGB* macros.
This patch implements these functions and macros for glibc. llogb
uses the type-generic infrastructure, with an implementation similar
to the wrapper for ilogb but with additional conversion from FP_ILOGB*
to FP_LLOGB*; this approach avoids needing to modify or duplicate any
of the architecture-specific ilogb implementations. Tests are also
based on those for ilogb.
Ideally the llogb functions would alias the ilogb ones when long is
32-bit, but such aliasing requires the associated header declarations
of the different-type alias to be hidden, typically by defining macros
before including the header (see e.g. how
sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c defines lround to
__hidden_lround before including <math.h>). The infrastructure for
type-generic function implementations does not support defining such
macros at present (since C code can't define a macro whose name is
determined by other macros). So this patch leaves them as separate
functions (similar to e.g. scalbln and scalbn being separate in such a
case as well), but with the remapping of FP_ILOGB* to FP_LLOGB*
conditioned out in the case where it would be the identity map.
Tested for x86_64, x86, mips64 and powerpc.
* math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (llogb):
New declaration.
* math/tgmath.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (llogb): New
macro.
* math/math.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (__FP_LONG_MAX):
New macro.
[__GLIBC_USE (IEC_60559_BFP_EXT)] (FP_LLOGB0): Likewise.
[__GLIBC_USE (IEC_60559_BFP_EXT)] (FP_LLOGBNAN): Likewise.
* math/Versions (llogb): New libm symbol at version GLIBC_2.25.
(llogbf): Likewise.
(llogbl): Likewise.
* math/Makefile (gen-libm-calls): Add w_llogbF.
(tests): Add test-fp-llogb-constants.
* math/w_llogb_template.c: New file. Based on
math/w_ilogb_template.c.
* math/libm-test.inc (llogb_test_data): New array.
(llogb_test): New function.
(main): Call llogb_test.
* math/test-fp-llogb-constants.c: New file. Based on
math/test-fp-ilogb-constants.c.
* math/test-tgmath-ret.c (llogb): New CHECK_RET_CONST call.
(do_test): Call check_return_llogb.
* math/test-tgmath.c (NCALLS): Increase to 126.
(F(compile_test)): Call llogb.
(F(llogb)): New function.
* manual/math.texi (Exponents and Logarithms): Document llogb,
llogbf, llogbl, FP_LLOGB0 and FP_LLOGBNAN.
* manual/libm-err-tab.pl (@all_functions): Add llogb.
* sysdeps/ieee754/ldbl-opt/nldbl-llogb.c: New file.
* sysdeps/ieee754/ldbl-opt/w_llogbl.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add llogb.
(CFLAGS-nldbl-llogb.c): New variable.
* sysdeps/nacl/libm.abilist: Update.
* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
2016-12-02 01:42:49 +00:00
|
|
|
"ilogb", "j0", "j1", "jn", "lgamma", "llogb", "lrint",
|
1999-10-29 17:38:14 +00:00
|
|
|
"llrint", "log", "log10", "log1p", "log2", "logb", "lround",
|
2016-06-16 15:51:26 +00:00
|
|
|
"llround", "modf", "nearbyint", "nextafter", "nextdown", "nexttoward",
|
|
|
|
"nextup", "pow", "remainder", "remquo", "rint", "round", "scalb",
|
|
|
|
"scalbn", "sin", "sincos", "sinh", "sqrt", "tan", "tanh", "tgamma",
|
1999-10-29 17:38:14 +00:00
|
|
|
"trunc", "y0", "y1", "yn" );
|
Add canonicalize, canonicalizef, canonicalizel.
TS 18661-1 defines canonicalize functions to produce a canonical
version of a floating-point representation. This patch implements
these functions for glibc.
As with the iscanonical macro, these functions are oriented to the
decimal floating-point case, where some values have both canonical and
noncanonical representations. However, the functions have a return
value that says whether they succeeded in storing a canonical result;
thus, they can fail for the case of an invalid representation (while
still not making any particular choice from among multiple equally
canonical valid representations of the same value). Since no
floating-point formats in glibc actually have noncanonical valid
representations, a type-generic implementation of these functions can
be used that expects iscanonical to return 0 only for invalid
representations. Now that iscanonical is used within libm.so,
libm_hidden_proto / libm_hidden_def are added for __iscanonicall.
The definition of these functions is intended to correspond to a
convertFormat operation to the same floating-point format. Thus, they
convert signaling NaNs to quiet NaNs, raising the "invalid" exception.
Such a conversion "should" produce "the canonical version of that
signaling NaN made quiet".
libm-test.inc is made to check NaN payloads for the output of these
functions, a new feature (at some point manipulation functions such as
fabs and copysign should have tests added that verify payload
preservation for them). As however some architectures may not follow
the recommended practice of preserving NaN payloads when converting a
signaling NaN to quiet, a new math-tests.h macro
SNAN_TESTS_PRESERVE_PAYLOAD is added, and defined to 0 for non-NAN2008
MIPS; any other architectures seeing test failures for lack of payload
preservation in this case should also define this macro to 0. (If any
cases arise where the sign isn't preserved either, those should have a
similar macro added.)
The ldbl-96 and ldbl-128ibm tests of iscanonical are renamed and
adapted to test canonicalizel as well on the same representations.
Tested for x86_64, x86, mips64 and powerpc.
* math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)]
(canonicalize): New declaration.
* math/Versions (canonicalize): New libm symbol at version
GLIBC_2.25.
(canonicalizef): Likewise.
(canonicalizel): Likewise.
* math/Makefile (gen-libm-calls): Add s_canonicalizeF.
* math/s_canonicalize_template.c: New file.
* math/libm-test.inc: Update comment on functions tested and
testing of NaN payloads.
(TEST_NAN_PAYLOAD): New macro.
(NO_TEST_INLINE): Update value.
(XFAIL_TEST): Likewise.
(ERRNO_UNCHANGED): Likewise.
(ERRNO_EDOM): Likewise.
(ERRNO_ERANGE): Likewise.
(IGNORE_RESULT): Likewise.
(NON_FINITE): Likewise.
(TEST_SNAN): Likewise.
(NO_TEST_MATHVEC): Likewise.
(TEST_NAN_PAYLOAD_CANONICALIZE): New macro.
(check_float_internal): Check NaN payloads if TEST_NAN_PAYLOAD.
(struct test_Ffp_b1_data): New type.
(RUN_TEST_Ffp_b1): New macro.
(RUN_TEST_LOOP_Ffp_b1): Likewise.
(canonicalize_test_data): New array.
(canonicalize_test): New function.
(main): Call canonicalize_test.
* manual/arith.texi (FP Bit Twiddling): Document canonicalize,
canonicalizef and canonicalizel.
* manual/libm-err-tab.pl: Update comment on interfaces without
ulps tabulated.
* sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c: New file.
* sysdeps/ieee754/ldbl-opt/s_canonicalizel.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add
canonicalize.
(CFLAGS-nldbl-canonicalize.c): New variable.
* sysdeps/ieee754/ldbl-128ibm/test-iscanonical-ldbl-128ibm.c: Move
to ...
* sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c:
... here.
(do_test): Also test canonicalizel.
* sysdeps/ieee754/ldbl-128ibm/Makefile (tests): Change
test-iscanonical-ldbl-128ibm to test-canonical-ldbl-128ibm.
* sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h: New
file.
* sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c (__iscanonicall):
Use libm_hidden_def.
* sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c: Move to ...
* sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c: ... here.
(do_test): Also test canonicalizel.
* sysdeps/ieee754/ldbl-96/Makefile (tests): Change
test-iscanonical-ldbl-96 to test-canonical-ldbl-96.
* sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h: New file.
* sysdeps/ieee754/ldbl-96/s_iscanonicall.c (__iscanonicall): Use
libm_hidden_def.
* sysdeps/generic/math-tests.h (SNAN_TESTS_PRESERVE_PAYLOAD): New
macro.
* sysdeps/mips/math-tests.h [__mips_hard_float && !__mips_nan2008]
(SNAN_TESTS_PRESERVE_PAYLOAD): Likewise.
* sysdeps/nacl/libm.abilist: Update.
* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
2016-10-26 23:14:31 +00:00
|
|
|
# canonicalize, fpclassify, getpayload, iscanonical, isnormal,
|
|
|
|
# isfinite, isinf, isnan, issignaling, issubnormal, iszero, signbit,
|
|
|
|
# iseqsig, isgreater, isgreaterequal, isless, islessequal,
|
2016-11-24 23:56:48 +00:00
|
|
|
# islessgreater, isunordered, setpayload, setpayloadsig,
|
|
|
|
# totalorder, totalordermag
|
2016-10-15 00:36:48 +00:00
|
|
|
# are not tabulated.
|
1999-10-29 17:38:14 +00:00
|
|
|
|
|
|
|
if ($#ARGV == 0) {
|
|
|
|
$sources = $ARGV[0];
|
|
|
|
} else {
|
|
|
|
$sources = '/usr/src/cvs/libc';
|
|
|
|
}
|
|
|
|
|
|
|
|
find (\&find_files, $sources);
|
|
|
|
|
2001-08-28 08:05:41 +00:00
|
|
|
@platforms = sort by_platforms @platforms;
|
|
|
|
|
1999-10-29 17:38:14 +00:00
|
|
|
&print_all;
|
|
|
|
|
|
|
|
sub find_files {
|
|
|
|
if ($_ eq 'libm-test-ulps') {
|
|
|
|
# print "Parsing $File::Find::name\n";
|
|
|
|
push @platforms, $File::Find::dir;
|
2016-11-04 16:49:06 +00:00
|
|
|
my ($file, $name);
|
|
|
|
$file = "${File::Find::name}-name";
|
|
|
|
open NAME, $file or die ("Can't open $file: $!");
|
|
|
|
$name = <NAME>;
|
|
|
|
chomp $name;
|
|
|
|
close NAME;
|
|
|
|
$pplatforms{$File::Find::dir} = $name;
|
1999-10-29 17:38:14 +00:00
|
|
|
&parse_ulps ($File::Find::name, $File::Find::dir);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# Parse ulps file
|
|
|
|
sub parse_ulps {
|
|
|
|
my ($file, $platform) = @_;
|
2014-03-05 15:02:38 +00:00
|
|
|
my ($test, $type, $float, $eps);
|
1999-10-29 17:38:14 +00:00
|
|
|
|
|
|
|
# $type has the following values:
|
|
|
|
# "normal": No complex variable
|
|
|
|
# "real": Real part of complex result
|
|
|
|
# "imag": Imaginary part of complex result
|
|
|
|
open ULP, $file or die ("Can't open $file: $!");
|
|
|
|
while (<ULP>) {
|
|
|
|
chop;
|
|
|
|
# ignore comments and empty lines
|
|
|
|
next if /^#/;
|
|
|
|
next if /^\s*$/;
|
|
|
|
if (/^Function: /) {
|
2001-06-05 06:21:21 +00:00
|
|
|
if (/Real part of/) {
|
1999-10-29 17:38:14 +00:00
|
|
|
s/Real part of //;
|
|
|
|
$type = 'real';
|
|
|
|
} elsif (/Imaginary part of/) {
|
|
|
|
s/Imaginary part of //;
|
|
|
|
$type = 'imag';
|
|
|
|
} else {
|
|
|
|
$type = 'normal';
|
|
|
|
}
|
|
|
|
($test) = ($_ =~ /^Function:\s*\"([a-zA-Z0-9_]+)\"/);
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
if (/^i?(float|double|ldouble):/) {
|
|
|
|
($float, $eps) = split /\s*:\s*/,$_,2;
|
|
|
|
if ($eps eq 'fail') {
|
|
|
|
$results{$test}{$platform}{$type}{$float} = 'fail';
|
|
|
|
} elsif ($eps eq "0") {
|
|
|
|
# ignore
|
|
|
|
next;
|
2001-08-28 08:05:41 +00:00
|
|
|
} elsif (!exists $results{$test}{$platform}{$type}{$float}
|
1999-10-29 17:38:14 +00:00
|
|
|
|| $results{$test}{$platform}{$type}{$float} ne 'fail') {
|
|
|
|
$results{$test}{$platform}{$type}{$float} = $eps;
|
|
|
|
}
|
|
|
|
if ($type =~ /^real|imag$/) {
|
|
|
|
$results{$test}{'type'} = 'complex';
|
|
|
|
} elsif ($type eq 'normal') {
|
|
|
|
$results{$test}{'type'} = 'normal';
|
|
|
|
}
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
print "Skipping unknown entry: `$_'\n";
|
|
|
|
}
|
|
|
|
close ULP;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub get_value {
|
|
|
|
my ($fct, $platform, $type, $float) = @_;
|
|
|
|
|
2001-08-28 08:05:41 +00:00
|
|
|
return (exists $results{$fct}{$platform}{$type}{$float}
|
1999-10-29 17:38:14 +00:00
|
|
|
? $results{$fct}{$platform}{$type}{$float} : "0");
|
|
|
|
}
|
|
|
|
|
2001-08-28 08:05:41 +00:00
|
|
|
sub print_platforms {
|
|
|
|
my (@p) = @_;
|
|
|
|
my ($fct, $platform, $float, $first, $i, $platform_no, $platform_total);
|
1999-10-29 17:38:14 +00:00
|
|
|
|
|
|
|
print '@multitable {nexttowardf} ';
|
2001-08-28 08:05:41 +00:00
|
|
|
foreach (@p) {
|
1999-10-29 17:38:14 +00:00
|
|
|
print ' {1000 + i 1000}';
|
|
|
|
}
|
|
|
|
print "\n";
|
|
|
|
|
|
|
|
print '@item Function ';
|
2001-08-28 08:05:41 +00:00
|
|
|
foreach (@p) {
|
1999-10-29 17:38:14 +00:00
|
|
|
print ' @tab ';
|
2016-11-04 16:49:06 +00:00
|
|
|
print $pplatforms{$_};
|
1999-10-29 17:38:14 +00:00
|
|
|
}
|
|
|
|
print "\n";
|
|
|
|
|
2001-08-28 08:05:41 +00:00
|
|
|
|
1999-10-29 17:38:14 +00:00
|
|
|
foreach $fct (@all_functions) {
|
|
|
|
foreach $float (@all_floats) {
|
|
|
|
print "\@item $fct$suffices{$float} ";
|
2001-08-28 08:05:41 +00:00
|
|
|
foreach $platform (@p) {
|
1999-10-29 17:38:14 +00:00
|
|
|
print ' @tab ';
|
|
|
|
if (exists $results{$fct}{$platform}{'normal'}{$float}
|
|
|
|
|| exists $results{$fct}{$platform}{'real'}{$float}
|
|
|
|
|| exists $results{$fct}{$platform}{'imag'}{$float}) {
|
|
|
|
if ($results{$fct}{'type'} eq 'complex') {
|
|
|
|
print &get_value ($fct, $platform, 'real', $float),
|
|
|
|
' + i ', &get_value ($fct, $platform, 'imag', $float);
|
|
|
|
} else {
|
|
|
|
print $results{$fct}{$platform}{'normal'}{$float};
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
print '-';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
print "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
print "\@end multitable\n";
|
|
|
|
}
|
2001-08-28 08:05:41 +00:00
|
|
|
|
|
|
|
sub print_all {
|
|
|
|
my ($i, $max);
|
|
|
|
|
|
|
|
my ($columns) = 5;
|
|
|
|
|
|
|
|
# Print only 5 platforms at a time.
|
|
|
|
for ($i=0; $i < $#platforms; $i+=$columns) {
|
|
|
|
$max = $i+$columns-1 > $#platforms ? $#platforms : $i+$columns-1;
|
|
|
|
print_platforms (@platforms[$i .. $max]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub by_platforms {
|
2016-11-04 16:49:06 +00:00
|
|
|
return $pplatforms{$a} cmp $pplatforms{$b};
|
2001-08-28 08:05:41 +00:00
|
|
|
}
|