mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 00:16:11 +00:00
181 lines
4.2 KiB
C
181 lines
4.2 KiB
C
|
|
/* 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;
|
|
}
|