This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
b30a2559b11812ed31f68fba3af697b103193286
[metaconfig.git] / U / perl / mantbits.U
1 ?RCS: $Id$
2 ?RCS:
3 ?RCS: Copyright (c) 2015 Jarkko Hietaniemi, H.Merijn Brand
4 ?RCS:
5 ?RCS: You may distribute under the terms of either the GNU General Public
6 ?RCS: License or the Artistic License, as specified in the README file.
7 ?RCS:
8 ?MAKE:longdblmantbits doublemantbits: Inlibc cat Compile run rm_try Setvar \
9         echo i_float i_sunmath d_longdbl longdblkind
10 ?MAKE:  -pick add $@ %<
11 ?S:doublemantbits:
12 ?S:     This symbol, if defined, tells how many mantissa bits
13 ?S:     there are in double precision floating point format.
14 ?S:     Note that this is usually DBL_MANT_DIG minus one, since
15 ?S:     with the standard IEEE 754 formats DBL_MANT_DIG includes
16 ?S:     the implicit bit which doesn't really exist.
17 ?S:.
18 ?S:longdblmantbits:
19 ?S:     This symbol, if defined, tells how many mantissa bits
20 ?S:     there are in long double precision floating point format.
21 ?S:     Note that this can be LDBL_MANT_DIG minus one,
22 ?S:     since LDBL_MANT_DIG can include the IEEE 754 implicit bit.
23 ?S:     The common x86-style 80-bit long double does not have
24 ?S:     an implicit bit.
25 ?S:.
26 ?C:DOUBLEMANTBITS:
27 ?C:     This symbol, if defined, tells how many mantissa bits
28 ?C:     there are in double precision floating point format.
29 ?C:     Note that this is usually DBL_MANT_DIG minus one, since
30 ?C:     with the standard IEEE 754 formats DBL_MANT_DIG includes
31 ?C:     the implicit bit, which doesn't really exist.
32 ?C:.
33 ?C:LONGDBLMANTBITS:
34 ?C:     This symbol, if defined, tells how many mantissa bits
35 ?C:     there are in long double precision floating point format.
36 ?C:     Note that this can be LDBL_MANT_DIG minus one,
37 ?C:     since LDBL_MANT_DIG can include the IEEE 754 implicit bit.
38 ?C:     The common x86-style 80-bit long double does not have
39 ?C:     an implicit bit.
40 ?C:.
41 ?H:#define DOUBLEMANTBITS  $doublemantbits
42 ?H:#define LONGDBLMANTBITS $longdblmantbits
43 ?H:.
44 ?F:!try
45 : Check the length of the double mantissa
46 $echo "Checking how many mantissa bits your doubles have..." >&4
47 $cat >try.c <<EOP
48 #$i_float I_FLOAT
49 #$i_sunmath I_SUNMATH
50 #ifdef I_FLOAT
51 # include <float.h>
52 #endif
53 #ifdef I_SUNMATH
54 # include <sunmath.h>
55 #endif
56 #ifdef DBL_MANT_DIG
57 # define BITS (DBL_MANT_DIG - 1) /* the implicit bit does not count */
58 #endif
59 #include <stdio.h>
60 int main(int argc, char *argv[]) {
61 #ifdef BITS
62   printf("%d\n", BITS);
63 #endif
64   return 0;
65 }
66 EOP
67 set try
68 if eval $compile; then
69     doublemantbits=`$run ./try`
70 else
71     doublemantbits="$undef"
72 fi
73 $rm_try
74
75 : Check the length of the longdouble mantissa
76 $echo "Checking how many mantissa bits your long doubles have..." >&4
77 $cat >try.c <<EOP
78 #$i_float I_FLOAT
79 #$i_sunmath I_SUNMATH
80 #ifdef I_FLOAT
81 # include <float.h>
82 #endif
83 #ifdef I_SUNMATH
84 # include <sunmath.h>
85 #endif
86 #$d_longdbl HAS_LONG_DOUBLE
87 #if defined(HAS_LONG_DOUBLE) && defined(LDBL_MANT_DIG)
88 # if ($longdblkind == 3) || ($longdblkind == 4) /* 80-bit extended precision */
89 /* This format has no implicit bit.  Beware, however, that for
90  * this format the bare LDBL_MANT_DIG is misleading for inf/nan:
91  * the top three bits are used for inf (100) / qnan (11x) / snan (101),
92  * and the top bit must have been one since 387, zero is plain invalid.
93  * For normal fp values, the LDBL_MANT_DIG is fine, though. */
94 #  define BITS LDBL_MANT_DIG
95 # elif ($longdblkind == 5 || $longdblkind == 6) /* double double */
96 /* LDBL_MANT_DIG of 106 (twice 53) would be logical, but for some
97  * reason e.g. Irix thinks 107.  But in any case, we want only
98  * the number of real bits, the implicit bits are of no interest.  */
99 #  define BITS 2 * (DBL_MANT_DIG - 1)
100 # else
101 #  define BITS (LDBL_MANT_DIG - 1) /* the implicit bit does not count */
102 # endif
103 #endif
104 #include <stdio.h>
105 int main(int argc, char *argv[]) {
106 #ifdef BITS
107   printf("%d\n", BITS);
108 #endif
109   return 0;
110 }
111 EOP
112 set try
113 if eval $compile; then
114     longdblmantbits=`$run ./try`
115 else
116     longdblmantbits="$undef"
117 fi
118 $rm_try
119