1 2 /* Program to check that the FP stuff underlying these common FP 3 functions isn't too badly broken. Carefully kludged to print the 4 same answers on different platforms (even when run natively). */ 5 6 #include <stdio.h> 7 #include <math.h> 8 9 int main ( void ) 10 { 11 double d; 12 float f; 13 int i; 14 15 const double tinyD = 0.0000000001; 16 const double tinyF = 0.0001; 17 18 /* -------------------- any arg -------------------- */ 19 20 d = -2.0; 21 for (i = 0; i < 41; i++) { 22 printf("floorD(%+20.13e) = %+20.13e\n", d, floor(d)); 23 d += 0.1-tinyD; 24 } 25 f = -2.0; 26 for (i = 0; i < 41; i++) { 27 printf("floorF(%+20.4e) = %+20.4e\n", (double)f, (double)floorf(f)); 28 f += 0.1-tinyF; 29 } 30 31 32 d = -2.0; 33 for (i = 0; i < 41; i++) { 34 printf(" ceilD(%+20.13e) = %+20.13e\n", d, ceil(d)); 35 d += 0.1-tinyD; 36 } 37 f = -2.0; 38 for (i = 0; i < 41; i++) { 39 printf(" ceilF(%+20.4e) = %+20.4e\n", (double)f, (double)ceilf(f)); 40 f += 0.1-tinyF; 41 } 42 43 44 d = -2.0; 45 for (i = 0; i < 41; i++) { 46 printf(" sinD(%+20.13e) = %+20.13e\n", d, sin(d)); 47 d += 0.1-tinyD; 48 } 49 f = -2.0; 50 for (i = 0; i < 41; i++) { 51 printf(" sinF(%+20.4e) = %+20.4e\n", (double)f, (double)sinf(f)); 52 f += 0.1-tinyF; 53 } 54 55 56 d = -2.0; 57 for (i = 0; i < 41; i++) { 58 printf(" cosD(%+20.13e) = %+20.13e\n", d, cos(d)); 59 d += 0.1-tinyD; 60 } 61 f = -2.0; 62 for (i = 0; i < 41; i++) { 63 printf(" cosF(%+20.4e) = %+20.4e\n", (double)f, (double)cosf(f)); 64 f += 0.1-tinyF; 65 } 66 67 68 d = -2.0; 69 for (i = 0; i < 41; i++) { 70 printf(" tanD(%+20.13e) = %+20.13e\n", d, tan(d)); 71 d += 0.1-tinyD; 72 } 73 f = -2.0; 74 for (i = 0; i < 41; i++) { 75 printf(" tanF(%+20.4e) = %+20.4e\n", (double)f, (double)tanf(f)); 76 f += 0.1-tinyF; 77 } 78 79 80 d = -2.0; 81 for (i = 0; i < 41; i++) { 82 printf(" expD(%+20.13e) = %+20.13e\n", d, exp(d)); 83 d += 0.1-tinyD; 84 } 85 f = -2.0; 86 for (i = 0; i < 41; i++) { 87 printf(" expF(%+20.4e) = %+20.4e\n", (double)f, (double)expf(f)); 88 f += 0.1-tinyF; 89 } 90 91 /* -------------------- >= 0 arg -------------------- */ 92 93 d = 0.0; 94 for (i = 0; i < 21; i++) { 95 printf(" sqrtD(%+20.13e) = %+20.13e\n", d, sqrt(d)); 96 d += 0.1-tinyD; 97 } 98 f = 0.0; 99 for (i = 0; i < 21; i++) { 100 printf(" sqrtF(%+20.4e) = %+20.4e\n", (double)f, (double)sqrtf(f)); 101 f += 0.1-tinyF; 102 } 103 104 105 d = 0.0; 106 for (i = 0; i < 21; i++) { 107 printf(" logD(%+20.13e) = %+20.13e\n", d, log(d)); 108 d += 0.1-tinyD; 109 } 110 f = 0.0; 111 for (i = 0; i < 21; i++) { 112 printf(" logF(%+20.4e) = %+20.4e\n", (double)f, (double)logf(f)); 113 f += 0.1-tinyF; 114 } 115 116 117 d = 0.0; 118 for (i = 0; i < 21; i++) { 119 printf("log10D(%+20.13e) = %+20.13e\n", d, log10(d)); 120 d += 0.1-tinyD; 121 } 122 f = 0.0; 123 for (i = 0; i < 21; i++) { 124 printf("log10F(%+20.4e) = %+20.4e\n", (double)f, (double)log10f(f)); 125 f += 0.1-tinyF; 126 } 127 128 /* -------------------- -1 .. +1 arg -------------------- */ 129 130 d = -1.0; 131 for (i = 0; i < 21; i++) { 132 printf(" asinD(%+20.13e) = %+20.13e\n", d, asin(d)); 133 d += 0.1-tinyD; 134 } 135 f = -1.0; 136 for (i = 0; i < 21; i++) { 137 printf(" asinF(%+20.4e) = %+20.4e\n", (double)f, (double)asinf(f)); 138 f += 0.1-tinyF; 139 } 140 141 /* acos(double) seems very prone to accuracy loss near the end of 142 the range (arg --> +1.0). Hence is different from the rest to 143 stop it getting so close to 1.0. */ 144 d = -1.0; 145 for (i = 0; i < 21; i++) { 146 printf(" acosD(%+20.13e) = %+20.10e\n", d, acos(d)); 147 d += 0.1 - 1000.0*tinyD; 148 } 149 f = -1.0; 150 for (i = 0; i < 21; i++) { 151 printf(" acosF(%+20.4e) = %+20.4e\n", (double)f, (double)acosf(f)); 152 f += 0.1-tinyF; 153 } 154 155 156 d = -1.0; 157 for (i = 0; i < 21; i++) { 158 printf(" atanD(%+20.13e) = %+20.13e\n", d, atan(d)); 159 d += 0.1-tinyD; 160 } 161 f = -1.0; 162 for (i = 0; i < 21; i++) { 163 printf(" atanF(%+20.4e) = %+20.4e\n", (double)f, (double)atanf(f)); 164 f += 0.1-tinyF; 165 } 166 167 168 d = -1.0; 169 for (i = 0; i < 21; i++) { 170 printf("atan2D(%+20.13e) = %+20.13e\n", d, atan2(d, 1.0)); 171 d += 0.1-tinyD; 172 } 173 f = -1.0; 174 for (i = 0; i < 21; i++) { 175 printf("atan2F(%+20.4e) = %+20.4e\n", (double)f, (double)atan2f(f,1.0)); 176 f += 0.1-tinyF; 177 } 178 179 return 0; 180 } 181