| |
| /* Program to check that the FP stuff underlying these common FP |
| functions isn't too badly broken. Carefully kludged to print the |
| same answers on different platforms (even when run natively). */ |
| |
| #include <stdio.h> |
| #include <math.h> |
| |
| int main ( void ) |
| { |
| double d; |
| float f; |
| int i; |
| |
| const double tinyD = 0.0000000001; |
| const double tinyF = 0.0001; |
| |
| /* -------------------- any arg -------------------- */ |
| |
| d = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf("floorD(%+20.13e) = %+20.13e\n", d, floor(d)); |
| d += 0.1-tinyD; |
| } |
| f = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf("floorF(%+20.4e) = %+20.4e\n", (double)f, (double)floorf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| |
| d = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" ceilD(%+20.13e) = %+20.13e\n", d, ceil(d)); |
| d += 0.1-tinyD; |
| } |
| f = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" ceilF(%+20.4e) = %+20.4e\n", (double)f, (double)ceilf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| |
| d = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" sinD(%+20.13e) = %+20.13e\n", d, sin(d)); |
| d += 0.1-tinyD; |
| } |
| f = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" sinF(%+20.4e) = %+20.4e\n", (double)f, (double)sinf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| |
| d = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" cosD(%+20.13e) = %+20.13e\n", d, cos(d)); |
| d += 0.1-tinyD; |
| } |
| f = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" cosF(%+20.4e) = %+20.4e\n", (double)f, (double)cosf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| |
| d = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" tanD(%+20.13e) = %+20.13e\n", d, tan(d)); |
| d += 0.1-tinyD; |
| } |
| f = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" tanF(%+20.4e) = %+20.4e\n", (double)f, (double)tanf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| |
| d = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" expD(%+20.13e) = %+20.13e\n", d, exp(d)); |
| d += 0.1-tinyD; |
| } |
| f = -2.0; |
| for (i = 0; i < 41; i++) { |
| printf(" expF(%+20.4e) = %+20.4e\n", (double)f, (double)expf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| /* -------------------- >= 0 arg -------------------- */ |
| |
| d = 0.0; |
| for (i = 0; i < 21; i++) { |
| printf(" sqrtD(%+20.13e) = %+20.13e\n", d, sqrt(d)); |
| d += 0.1-tinyD; |
| } |
| f = 0.0; |
| for (i = 0; i < 21; i++) { |
| printf(" sqrtF(%+20.4e) = %+20.4e\n", (double)f, (double)sqrtf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| |
| d = 0.0; |
| for (i = 0; i < 21; i++) { |
| printf(" logD(%+20.13e) = %+20.13e\n", d, log(d)); |
| d += 0.1-tinyD; |
| } |
| f = 0.0; |
| for (i = 0; i < 21; i++) { |
| printf(" logF(%+20.4e) = %+20.4e\n", (double)f, (double)logf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| |
| d = 0.0; |
| for (i = 0; i < 21; i++) { |
| printf("log10D(%+20.13e) = %+20.13e\n", d, log10(d)); |
| d += 0.1-tinyD; |
| } |
| f = 0.0; |
| for (i = 0; i < 21; i++) { |
| printf("log10F(%+20.4e) = %+20.4e\n", (double)f, (double)log10f(f)); |
| f += 0.1-tinyF; |
| } |
| |
| /* -------------------- -1 .. +1 arg -------------------- */ |
| |
| d = -1.0; |
| for (i = 0; i < 21; i++) { |
| printf(" asinD(%+20.13e) = %+20.13e\n", d, asin(d)); |
| d += 0.1-tinyD; |
| } |
| f = -1.0; |
| for (i = 0; i < 21; i++) { |
| printf(" asinF(%+20.4e) = %+20.4e\n", (double)f, (double)asinf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| /* acos(double) seems very prone to accuracy loss near the end of |
| the range (arg --> +1.0). Hence is different from the rest to |
| stop it getting so close to 1.0. */ |
| d = -1.0; |
| for (i = 0; i < 21; i++) { |
| printf(" acosD(%+20.13e) = %+20.10e\n", d, acos(d)); |
| d += 0.1 - 1000.0*tinyD; |
| } |
| f = -1.0; |
| for (i = 0; i < 21; i++) { |
| printf(" acosF(%+20.4e) = %+20.4e\n", (double)f, (double)acosf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| |
| d = -1.0; |
| for (i = 0; i < 21; i++) { |
| printf(" atanD(%+20.13e) = %+20.13e\n", d, atan(d)); |
| d += 0.1-tinyD; |
| } |
| f = -1.0; |
| for (i = 0; i < 21; i++) { |
| printf(" atanF(%+20.4e) = %+20.4e\n", (double)f, (double)atanf(f)); |
| f += 0.1-tinyF; |
| } |
| |
| |
| d = -1.0; |
| for (i = 0; i < 21; i++) { |
| printf("atan2D(%+20.13e) = %+20.13e\n", d, atan2(d, 1.0)); |
| d += 0.1-tinyD; |
| } |
| f = -1.0; |
| for (i = 0; i < 21; i++) { |
| printf("atan2F(%+20.4e) = %+20.4e\n", (double)f, (double)atan2f(f,1.0)); |
| f += 0.1-tinyF; |
| } |
| |
| return 0; |
| } |