You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							129 lines
						
					
					
						
							5.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							129 lines
						
					
					
						
							5.1 KiB
						
					
					
				| # floatparam.m4 serial 1 | |
| dnl Copyright (C) 2005 Free Software Foundation, Inc. | |
| dnl This file is free software; the Free Software Foundation | |
| dnl gives unlimited permission to copy and/or distribute it, | |
| dnl with or without modifications, as long as this notice is preserved. | |
| 
 | |
| dnl From Bruno Haible. | |
| 
 | |
| AC_DEFUN([CL_FLOATPARAM_CROSS], | |
| [ | |
|   AC_REQUIRE([CL_LONGDOUBLE]) | |
|   cl_machine_file_h=$1 | |
|   { | |
|     echo "/* Rounding modes, for use below */" | |
|     echo "#define rounds_to_nearest        0  /* 0.5 ulp */" | |
|     echo "#define rounds_to_zero           1  /* 1 ulp */" | |
|     echo "#define rounds_to_infinity       2  /* 1 ulp */" | |
|     echo "#define rounds_to_minus_infinity 3  /* 1 ulp */" | |
|     echo | |
|     for type in float double "`if test $cl_cv_c_longdouble = yes; then echo 'long double'; fi`"; do | |
|       if test -n "$type"; then | |
|         epsilon_bits=-1; y="($type)1.0" | |
|         while true; do | |
|           AC_TRY_COMPILE([], | |
|             [typedef int verify[2*( | |
|                (($type)(($type)1.0 + ($type)($y)) == ($type)1.0) | |
|                || ($type)(($type)(($type)1.0 + ($type)($y)) - ($type)1.0) != ($type)($y) | |
|              ) - 1];], | |
|             [break;]) | |
|           epsilon_bits=`expr $epsilon_bits + 1`; y="$y * ($type)0.5" | |
|         done | |
|         negepsilon_bits=-1; y="($type)-1.0" | |
|         while true; do | |
|           AC_TRY_COMPILE([], | |
|             [typedef int verify[2*( | |
|                (($type)(($type)1.0 + ($type)($y)) == ($type)1.0) | |
|                || ($type)(($type)(($type)1.0 + ($type)($y)) - ($type)1.0) != ($type)($y) | |
|              ) - 1];], | |
|             [break;]) | |
|           negepsilon_bits=`expr $negepsilon_bits + 1`; y="$y * ($type)0.5" | |
|         done | |
|         echo "/* Properties of type \`$type': */" | |
|         echo "/* Largest n for which 1+2^(-n) is exactly represented is $epsilon_bits. */" | |
|         echo "/* Largest n for which 1-2^(-n) is exactly represented is $negepsilon_bits. */" | |
|         if test `expr $negepsilon_bits '<=' $epsilon_bits` = 1; then | |
|           echo "#error \"No exponent jump at 1.0 for type $type!\"" | |
|         else | |
|           if test `expr $negepsilon_bits '>' $epsilon_bits + 1` = 1; then | |
|             echo "/* Base for type '$type' is 2^"`expr $negepsilon_bits - $epsilon_bits` | |
|           fi | |
|           echo "#define "`echo $type | sed -e 's, ,_,g'`"_mant_bits "`expr $epsilon_bits + 1` | |
|         fi | |
|         x="($type)1.0" | |
|         i=$epsilon_bits | |
|         while test $i != 0; do | |
|           x="$x * ($type)0.5" | |
|           i=`expr $i - 1` | |
|         done | |
|         x="($type)($x)" | |
|         y1="($type)(($type)1.0 + ($type)5.0*$x)" | |
|         y2="($type)(($type)1.0 + ($type)6.0*$x)" | |
|         ys1="($type)(($type)1.0 + ($type)5.4*$x)" | |
|         ys2="($type)(($type)1.0 + ($type)5.6*$x)" | |
|         z1="($type)(($type)-1.0 + ($type)(-5.0)*$x)" | |
|         z2="($type)(($type)-1.0 + ($type)(-6.0)*$x)" | |
|         zs1="($type)(($type)-1.0 + ($type)(-5.4)*$x)" | |
|         zs2="($type)(($type)-1.0 + ($type)(-5.6)*$x)" | |
|         rounds= | |
|         if test -z "$rounds"; then | |
|           AC_TRY_COMPILE([], | |
|             [typedef int verify[2*( | |
|                $ys1 == $y1 && $ys2 == $y2 && $zs1 == $z1 && $zs2 == $z2 | |
|              ) - 1];], | |
|             [rounds=rounds_to_nearest]) | |
|         fi | |
|         if test -z "$rounds"; then | |
|           AC_TRY_COMPILE([], | |
|             [typedef int verify[2*( | |
|                $ys1 == $y1 && $ys2 == $y1 && $zs1 == $z1 && $zs2 == $z1 | |
|              ) - 1];], | |
|             [rounds=rounds_to_zero]) | |
|         fi | |
|         if test -z "$rounds"; then | |
|           AC_TRY_COMPILE([], | |
|             [typedef int verify[2*( | |
|                $ys1 == $y2 && $ys2 == $y2 && $zs1 == $z1 && $zs2 == $z1 | |
|              ) - 1];], | |
|             [rounds=rounds_to_infinity]) | |
|         fi | |
|         if test -z "$rounds"; then | |
|           AC_TRY_COMPILE([], | |
|             [typedef int verify[2*( | |
|                $ys1 == $y1 && $ys2 == $y1 && $zs1 == $z2 && $zs2 == $z2 | |
|              ) - 1];], | |
|             [rounds=rounds_to_minus_infinity]) | |
|         fi | |
|         if test -n "$rounds"; then | |
|           echo "#define "`echo $type | sed -e 's, ,_,g'`"_rounds $rounds" | |
|         else | |
|           echo "#error \"Unknown rounding mode for type $type!\"" | |
|         fi | |
|         echo | |
|       fi | |
|     done | |
|     dnl Words-in-a-double endianness test. Note that, assuming IEEE 754 format, | |
|     dnl 2.5479915693083957     = { 0x40 0x04 0x62 0x49 0x67 0x65 0x4E 0x64 } ..bIgeNd | |
|     dnl 1.4396527506122064e164 = { 0x62 0x04 0x00 0x00 0x4E 0x65 0x67 0x49 } b...NegI | |
|     dnl 2.5495230282078065     = { 0x40 0x04 0x65 0x6C 0x54 0x54 0x69 0x4C } ..elTTiL | |
|     dnl 1.4139248369879473e214 = { 0x6C 0x65 0x00 0x00 0x4C 0x69 0x54 0x54 } le..LiTT | |
|     double_wordorder_bigendian_p= | |
|     AC_TRY_COMPILE([double a[9] = { | |
|        0, 2.5479915693083957, 0, 1.4396527506122064e164, | |
|        0, 2.5495230282078065, 0, 1.4139248369879473e214, | |
|        0 };], [], [ | |
|       if grep LiTTle conftest.$ac_objext >/dev/null ; then | |
|         double_wordorder_bigendian_p=0 | |
|       else | |
|         if grep bIgeN conftest.$ac_objext >/dev/null ; then | |
|           double_wordorder_bigendian_p=1 | |
|         fi | |
|       fi]) | |
|     if test -n "$double_wordorder_bigendian_p"; then | |
|       echo "#define double_wordorder_bigendian_p $double_wordorder_bigendian_p" | |
|     else | |
|       echo "/* Dazed and confused!  Better not define anything. */" | |
|     fi | |
|     echo | |
|   } > "$cl_machine_file_h" | |
| ])
 |