if (d != 0.f) result = 1.f / d;
Completely forgetting the denormalized numbers. float var = 1.f; for (int i = 0; i < 50; i++) { var /= 10.f; float result = 1.f / var; printf("1 / %e = %e\n", var, result); }
...
1 / 9.999999e-035 = 1.000000e+034
1 / 9.999999e-036 = 1.000000e+035
1 / 9.999999e-037 = 1.000000e+036
1 / 1.000000e-037 = 1.000000e+037
1 / 9.999999e-039 = 1.000000e+038
1 / 1.000000e-039 = 1.#INF00e+000 << —
1 / 9.999946e-041 = 1.#INF00e+000
1 / 9.999666e-042 = 1.#INF00e+000
1 / 1.000527e-042 = 1.#INF00e+000
1 / 9.949219e-044 = 1.#INF00e+000
1 / 9.809089e-045 = 1.#INF00e+000
1 / 1.401298e-045 = 1.#INF00e+000
...
float x1 = 10.f; // float y1 = 1.f; float length1 = sqrt(x1 * x1 + y1 * y1); x1 /= length1; y1 /= length1; // float x2 = 2.f; // float y2 = 10.f; float length2 = sqrt(x2 * x2 + y2 * y2); x2 /= length2; y2 /= length2; // float dotProduct = x1 * x2 + y1 * y2; // float angle = acos(dotProduct); printf("acos(dotProduct) = %e\n", angle); //
for (int i = 0; i < 100; i++) { float x1 = 10.f; float y1 = 5.e-3f * (rand() % 10000) / 10000; // float length1 = sqrt(x1 * x1 + y1 * y1); x1 /= length1; y1 /= length1; float x2 = 10.f; float y2 = 5.e-3f * (rand() % 10000) / 10000; float length2 = sqrt(x2 * x2 + y2 * y2); x2 /= length2; y2 /= length2; float dotProduct = x1 * x2 + y1 * y2; float angle = acos(dotProduct); printf("dotProduct = %1.8f acos(dotProduct) = %e\n", dotProduct, angle); }
...
dotProduct = 1.00000000 acos(dotProduct) = 0.000000e+000
dotProduct = 1.00000000 acos(dotProduct) = 0.000000e+000
dotProduct = 0.99999994 acos(dotProduct) = 3.452670e-004
dotProduct = 1.00000012 acos(dotProduct) = -1.#IND00e+000 << NaN
dotProduct = 1.00000000 acos(dotProduct) = 0.000000e+000
dotProduct = 1.00000012 acos(dotProduct) = -1.#IND00e+000 << NaN
...
Source: https://habr.com/ru/post/116300/
All Articles