1 /* Excess precision tests. Test that excess precision is carried 2 through various operations. */ 3 /* { dg-do run } */ 4 /* { dg-options "-O2 -mfpmath=387 -fexcess-precision=standard" } */ 5 6 #include <float.h> 7 8 extern void abort (void); 9 extern void exit (int); 10 11 volatile float f1 = 1.0f; 12 volatile float f2 = 0x1.0p-30f; 13 volatile float f3 = 0x1.0p-60f; 14 volatile double d1 = 1.0; 15 volatile double d2 = 0x1.0p-30; 16 volatile double d3 = 0x1.0p-60; 17 volatile float fadd1 = 1.0f + 0x1.0p-30f; 18 volatile double dadd2 = 1.0 + 0x1.0p-30 + 0x1.0p-60; 19 volatile long double ldadd1 = 1.0l + 0x1.0p-30l; 20 volatile long double ldadd2 = 1.0l + 0x1.0p-30l + 0x1.0p-60l; 21 22 void test_add(void)23test_add (void) 24 { 25 if (f1 + f2 != ldadd1) 26 abort (); 27 if (f1 + f2 + f3 != ldadd2) 28 abort (); 29 if (d1 + d2 != ldadd1) 30 abort (); 31 if (d1 + d2 + d3 != ldadd2) 32 abort (); 33 if (f1 + d2 + f3 != ldadd2) 34 abort (); 35 if (f1 + f2 == fadd1) 36 abort (); 37 if (f1 + f2 <= fadd1) 38 abort (); 39 if (f1 + f2 < fadd1) 40 abort (); 41 if (sizeof(long double) > sizeof(double)) { 42 if ( d1 + d2 + d3 == dadd2) 43 abort (); 44 if (!(d1 + d2 + d3 > dadd2)) 45 abort (); 46 if (!(d1 + d2 + d3 >= dadd2)) 47 abort (); 48 } 49 else { 50 if ( d1 + d2 + d3 != dadd2 ) 51 abort(); 52 if ( d1 + d2 + d3 < dadd2 ) 53 abort(); 54 if ( d1 + d2 + d3 > dadd2 ) 55 abort(); 56 } 57 } 58 59 volatile long double ldsub1 = 1.0l - 0x1.0p-30l; 60 volatile long double ldsub2 = 1.0l - 0x1.0p-30l - 0x1.0p-60l; 61 62 void test_sub(void)63test_sub (void) 64 { 65 if (f1 - f2 != ldsub1) 66 abort (); 67 if (f1 - f2 - f3 != ldsub2) 68 abort (); 69 if (d1 - d2 != ldsub1) 70 abort (); 71 if (d1 - d2 - d3 != ldsub2) 72 abort (); 73 if (f1 - d2 - f3 != ldsub2) 74 abort (); 75 if (+(f1 - d2 - f3) != ldsub2) 76 abort (); 77 if (-(f1 - d2 - f3) != -ldsub2) 78 abort (); 79 } 80 81 volatile float flt_min = FLT_MIN; 82 volatile double dbl_min = DBL_MIN; 83 volatile long double flt_min2 = (long double)FLT_MIN * (long double)FLT_MIN; 84 volatile long double dbl_min3 = (long double)DBL_MIN * (long double)DBL_MIN * (long double)DBL_MIN; 85 86 void test_mul(void)87test_mul (void) 88 { 89 if (flt_min * flt_min != flt_min2) 90 abort (); 91 if (flt_min * flt_min == 0) 92 abort (); 93 if (flt_min * flt_min == 0) 94 abort (); 95 if (!(flt_min * flt_min)) 96 abort (); 97 if (dbl_min * dbl_min * dbl_min != dbl_min3) 98 abort (); 99 if ((long double)(dbl_min * dbl_min * dbl_min) != dbl_min3) 100 abort (); 101 if ((0, dbl_min * dbl_min * dbl_min) != dbl_min3) 102 abort (); 103 if (sizeof(long double) > sizeof(double) ) { 104 if (dbl_min * dbl_min * dbl_min == 0) 105 abort (); 106 if ((flt_min * flt_min ? dbl_min * dbl_min * dbl_min : 0) == 0) 107 abort (); 108 } 109 else { 110 if (dbl_min * dbl_min * dbl_min != 0) 111 abort (); 112 if ((flt_min * flt_min ? dbl_min * dbl_min * dbl_min : 1) != 0) 113 abort (); 114 } 115 if ((flt_min * flt_min ? : 0) == 0) 116 abort (); 117 } 118 119 volatile float f4 = 0x1.0p100f; 120 volatile double d4 = 0x1.0p100; 121 volatile long double flt_div = 0x1.0p100l / (long double) FLT_MIN; 122 volatile long double dbl_div = 0x1.0p100l / (long double) DBL_MIN; 123 124 void test_div(void)125test_div (void) 126 { 127 if (f4 / flt_min != flt_div) 128 abort (); 129 if (d4 / dbl_min != dbl_div) 130 abort (); 131 } 132 133 volatile float f5 = 0x1.0p30; 134 135 void test_cast(void)136test_cast (void) 137 { 138 if ((int)(f1 + f5) != 0x40000001) 139 abort (); 140 } 141 142 volatile float _Complex f1c = 1.0f + 1.0if; 143 volatile float _Complex f2c = 0x1.0p-30f + 0x1.0p-31if; 144 volatile float _Complex f3c = 0x1.0p-60f + 0x1.0p-59if; 145 volatile double _Complex d1c = 1.0 + 1.0i; 146 volatile double _Complex d2c = 0x1.0p-30 + 0x1.0p-31i; 147 volatile double _Complex d3c = 0x1.0p-60 + 0x1.0p-59i; 148 volatile long double _Complex ldadd1c = 1.0l + 0x1.0p-30l + 1.0il + 0x1.0p-31il; 149 volatile long double _Complex ldadd2c = 1.0l + 0x1.0p-30l + 0x1.0p-60l + 1.0il + 0x1.0p-31il + 0x1.0p-59il; 150 volatile long double _Complex ldadd2cc = 1.0l + 0x1.0p-30l + 0x1.0p-60l - 1.0il - 0x1.0p-31il - 0x1.0p-59il; 151 volatile float _Complex flt_minc = FLT_MIN; 152 volatile double _Complex dbl_minc = DBL_MIN; 153 volatile float _Complex f4c = 0x1.0p100f; 154 volatile double _Complex d4c = 0x1.0p100; 155 156 void test_complex(void)157test_complex (void) 158 { 159 if (f1c + f2c != ldadd1c) 160 abort (); 161 if (f1c + f2c + f3c != ldadd2c) 162 abort (); 163 if (d1c + d2c != ldadd1c) 164 abort (); 165 if (d1c + d2c + d3c != ldadd2c) 166 abort (); 167 if (__real__ (f1c + f2c + f3c) != ldadd2) 168 abort (); 169 if (__imag__ (d1c + d2c + d3c) != __imag__ ldadd2c) 170 abort (); 171 if (~(d1c + d2c + d3c) != ldadd2cc) 172 abort (); 173 /* The following call libgcc functions and so would fail unless they 174 call those for long double. */ 175 if (flt_minc * flt_minc != flt_min2) 176 abort (); 177 if (dbl_minc * dbl_minc * dbl_minc != dbl_min3) 178 abort (); 179 if (f4c / flt_minc != flt_div) 180 abort (); 181 if (d4c / dbl_minc != dbl_div) 182 abort (); 183 if (f4 / flt_minc != flt_div) 184 abort (); 185 if (d4 / dbl_minc != dbl_div) 186 abort (); 187 if (f4c / flt_min != flt_div) 188 abort (); 189 if (d4c / dbl_min != dbl_div) 190 abort (); 191 } 192 193 int main(void)194main (void) 195 { 196 test_add (); 197 test_sub (); 198 test_mul (); 199 test_div (); 200 test_cast (); 201 test_complex (); 202 exit (0); 203 } 204