]> www.ginac.de Git - cln.git/blob - m4/floatparam.m4
Fetch imported m4 files during autogen.sh invocation.
[cln.git] / m4 / floatparam.m4
1 # floatparam.m4 serial 1
2 dnl Copyright (C) 2005 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 dnl From Bruno Haible.
8
9 AC_DEFUN([CL_FLOATPARAM_CROSS],
10 [
11   AC_REQUIRE([CL_LONGDOUBLE])
12   cl_machine_file_h=$1
13   {
14     echo "/* Rounding modes, for use below */"
15     echo "#define rounds_to_nearest        0  /* 0.5 ulp */"
16     echo "#define rounds_to_zero           1  /* 1 ulp */"
17     echo "#define rounds_to_infinity       2  /* 1 ulp */"
18     echo "#define rounds_to_minus_infinity 3  /* 1 ulp */"
19     echo
20     for type in float double "`if test $cl_cv_c_longdouble = yes; then echo 'long double'; fi`"; do
21       if test -n "$type"; then
22         epsilon_bits=-1; y="($type)1.0"
23         while true; do
24           AC_TRY_COMPILE([],
25             [static_assert((($type)(($type)1.0 + ($type)($y)) == ($type)1.0)
26                          || ($type)(($type)(($type)1.0 + ($type)($y)) - ($type)1.0) != ($type)($y), "");],
27             [break;])
28           epsilon_bits=`expr $epsilon_bits + 1`; y="$y * ($type)0.5"
29         done
30         negepsilon_bits=-1; y="($type)-1.0"
31         while true; do
32           AC_TRY_COMPILE([],
33             [static_assert((($type)(($type)1.0 + ($type)($y)) == ($type)1.0)
34                          || ($type)(($type)(($type)1.0 + ($type)($y)) - ($type)1.0) != ($type)($y), "");],
35             [break;])
36           negepsilon_bits=`expr $negepsilon_bits + 1`; y="$y * ($type)0.5"
37         done
38         echo "/* Properties of type \`$type': */"
39         echo "/* Largest n for which 1+2^(-n) is exactly represented is $epsilon_bits. */"
40         echo "/* Largest n for which 1-2^(-n) is exactly represented is $negepsilon_bits. */"
41         if test `expr $negepsilon_bits '<=' $epsilon_bits` = 1; then
42           echo "#error \"No exponent jump at 1.0 for type $type!\""
43         else
44           if test `expr $negepsilon_bits '>' $epsilon_bits + 1` = 1; then
45             echo "/* Base for type '$type' is 2^"`expr $negepsilon_bits - $epsilon_bits`
46           fi
47           echo "#define "`echo $type | sed -e 's, ,_,g'`"_mant_bits "`expr $epsilon_bits + 1`
48         fi
49         x="($type)1.0"
50         i=$epsilon_bits
51         while test $i != 0; do
52           x="$x * ($type)0.5"
53           i=`expr $i - 1`
54         done
55         x="($type)($x)"
56         y1="($type)(($type)1.0 + ($type)5.0*$x)"
57         y2="($type)(($type)1.0 + ($type)6.0*$x)"
58         ys1="($type)(($type)1.0 + ($type)5.4*$x)"
59         ys2="($type)(($type)1.0 + ($type)5.6*$x)"
60         z1="($type)(($type)-1.0 + ($type)(-5.0)*$x)"
61         z2="($type)(($type)-1.0 + ($type)(-6.0)*$x)"
62         zs1="($type)(($type)-1.0 + ($type)(-5.4)*$x)"
63         zs2="($type)(($type)-1.0 + ($type)(-5.6)*$x)"
64         rounds=
65         if test -z "$rounds"; then
66           AC_TRY_COMPILE([],
67             [static_assert($ys1 == $y1 && $ys2 == $y2 && $zs1 == $z1 && $zs2 == $z2, "");],
68             [rounds=rounds_to_nearest])
69         fi
70         if test -z "$rounds"; then
71           AC_TRY_COMPILE([],
72             [static_assert($ys1 == $y1 && $ys2 == $y1 && $zs1 == $z1 && $zs2 == $z1, "");],
73             [rounds=rounds_to_zero])
74         fi
75         if test -z "$rounds"; then
76           AC_TRY_COMPILE([],
77             [static_assert($ys1 == $y2 && $ys2 == $y2 && $zs1 == $z1 && $zs2 == $z1, "");],
78             [rounds=rounds_to_infinity])
79         fi
80         if test -z "$rounds"; then
81           AC_TRY_COMPILE([],
82             [static_assert($ys1 == $y1 && $ys2 == $y1 && $zs1 == $z2 && $zs2 == $z2, "");],
83             [rounds=rounds_to_minus_infinity])
84         fi
85         if test -n "$rounds"; then
86           echo "#define "`echo $type | sed -e 's, ,_,g'`"_rounds $rounds"
87         else
88           echo "#error \"Unknown rounding mode for type $type!\""
89         fi
90         echo
91       fi
92     done
93     dnl Words-in-a-double endianness test. Note that, assuming IEEE 754 format,
94     dnl 2.5479915693083957     = { 0x40 0x04 0x62 0x49 0x67 0x65 0x4E 0x64 } ..bIgeNd
95     dnl 1.4396527506122064e164 = { 0x62 0x04 0x00 0x00 0x4E 0x65 0x67 0x49 } b...NegI
96     dnl 2.5495230282078065     = { 0x40 0x04 0x65 0x6C 0x54 0x54 0x69 0x4C } ..elTTiL
97     dnl 1.4139248369879473e214 = { 0x6C 0x65 0x00 0x00 0x4C 0x69 0x54 0x54 } le..LiTT
98     double_wordorder_bigendian_p=
99     AC_TRY_COMPILE([double a[9] = {
100        0, 2.5479915693083957, 0, 1.4396527506122064e164,
101        0, 2.5495230282078065, 0, 1.4139248369879473e214,
102        0 };], [], [
103       if grep LiTTle conftest.$ac_objext >/dev/null ; then
104         double_wordorder_bigendian_p=0
105       else
106         if grep bIgeN conftest.$ac_objext >/dev/null ; then
107           double_wordorder_bigendian_p=1
108         fi
109       fi])
110     if test -n "$double_wordorder_bigendian_p"; then
111       echo "#define double_wordorder_bigendian_p $double_wordorder_bigendian_p"
112     else
113       echo "/* Dazed and confused!  Better not define anything. */"
114     fi
115     echo
116   } > "$cl_machine_file_h"
117 ])