

-----------------------------------

nobody

11 Feb 2024 20:33



-----------------------------------

warning: format &#8216;%lu&#8217; expects argument of type &#8216;long unsigned int&#8217;, but argument 4 has type &#8216;uint32_t&#8217; {aka &#8216;unsigned int&#8217;}

Poate asa este mai intuitiv ce se intampla cand inghesui 32bit de UINT in 23bit de FLOAT:
printf("getting %d %s for (UINT a %u to (float)a %0.f == FLOAT %0.f)\r\n", e, e ? "(__equal__)" : "(not equal)", a, (float)a, floatA);

getting 1 (__equal__) for (UINT a 4294967041 to (float)a 4294967040 == FLOAT 4294967040)
...
getting 1 (__equal__) for (UINT a 4294967167 to (float)a 4294967040 == FLOAT 4294967040)
getting 0 (not equal) for (UINT a 4294967168 to (float)a 4294967296 == FLOAT 4294967040)


Dar deocamdata nu stim care a fost problema.
Parerea mea este ca ar fi trebuit sa mearga si cu float la ce fel de calcule se fac, chiar daca este f. ineficient. Poate e de vina doar ordinea in care se fac calculele, formulele matematice 'corecte' presupun o precizie infinita. La fel de bine poti s-o dai in bara si cu DOUBLE64, si pe 128 ... un clasic exemplu este Windows Calculator ... calculezi radical din 4 iar din rezultat scazi 2  ... vezi cei iese  :)

