More testing
#include <stdio.h>
#include <math.h>
#define NUM_A "-0.0000000000000000000000000001"
int main(int argc, char *argv[ ])
{
float a = 1;
float a2 = -0.0000000000000000000000000001;
double b;
a = -10 * (a - a);
printf("-10 * (1 - 1) = %e\n", a);
a = 0;
a = -10 * a;
printf("-10 * 0 = %e\n", a);
a = a / a;
printf("-0 / -0 = %e\n", a);
a = -1.0E-28;
printf("-1.0e-28 = %f\n", a);
printf("-1.0e-28 = %e\n", a);
printf(NUM_A" = %f\n", a2);
printf(NUM_A" = %e\n", a2);
a = powf(a, 2.0);
printf("powf(-1.0E-28, 2.0) = %e\n", a);
a = powf(a2, 2.0);
printf("powf("NUM_A", 2.0) = %e\n", a);
a = powf(-1.0E-28, 15.0);
printf("powf(-1.0E-28, 15.0) = %e\n", a);
a = powf(a2, 15.0);
printf("powf("NUM_A", 15.0) = %e\n", a);
a = a2 / a2;
printf(NUM_A" / "NUM_A" = %e\n", a);
a = a2 / 1.0e+30;
printf(NUM_A" / 1.0e+30 = %e\n", a);
b = a2 / 1.0e+300;
printf(NUM_A" / 1.0e+300 = %e\n", b);
a = 10 / -INFINITY;
printf("10 / -inf = %e\n", a);
return 0;
}
Result:
-10 * (1 - 1) = -0.000000e+00
-10 * 0 = -0.000000e+00
-0 / -0 = nan
-1.0e-28 = -0.000000
-1.0e-28 = -1.000000e-28
-0.0000000000000000000000000001 = -0.000000
-0.0000000000000000000000000001 = -1.000000e-28
powf(-1.0E-28, 2.0) = inf
powf(-0.0000000000000000000000000001, 2.0) = inf
powf(-1.0E-28, 15.0) = -inf
powf(-0.0000000000000000000000000001, 15.0) = -inf
-0.0000000000000000000000000001 / -0.0000000000000000000000000001 = 1.000000e+00
-0.0000000000000000000000000001 / 1.0e+30 = -1.000000e-58
-0.0000000000000000000000000001 / 1.0e+300 = -0.000000e+00
10 / -inf = -0.000000e+00
Interesting, if compiler Optimizations = None then:
a = a2 / 1.0e+30;
printf(NUM_A" / 1.0e+30 = %e\n", a);
Given the result:
-0.0000000000000000000000000001 / 1.0e+30 = -0.000000e+00