infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Alexandru-Iancu Caragicu din Februarie 01, 2011, 13:07:25



Titlul: Operatii ciudate cu numere zecimale
Scris de: Alexandru-Iancu Caragicu din Februarie 01, 2011, 13:07:25
La urmatorul program:
Cod:
#include <cstdio>

int main()
{
float a = (float)4.2;
float ca = a;
printf("a = %f\n",a);
printf("a * 10 = %f\n",a*10);
printf("a * 10 * 10 = %f\n",a*10*10);
printf("a * 100 = %f\n\n",a*100);

printf("a = %f\n",a);
printf("a *= 10\n");
a *= 10;
printf("a = %f\n\n",a);

printf("a *= 10\n");
a *= 10;
printf("a = %f\n\n",a);

printf("reset(a)\n");
a = ca;
printf("a = %f\n\n",a);

printf("a *= 100\n");
a *= 100;
printf("a = %f\n\n",a);

printf("reset(a)\n");
a = ca;
printf("a = %f\n\n",a);

printf("a *= 1000\n");
a *= 1000;
printf("a = %f\n\n",a);
return 0;
}
va da urmatoarea iesire?
Cod:
a = 4.200000
a * 10 = 41.999998
a * 10 * 10 = 419.999981
a * 100 = 419.999981

a = 4.200000
a *= 10
a = 42.000000

a *= 10
a = 420.000000

reset(a)
a = 4.200000

a *= 100
a = 419.999969

reset(a)
a = 4.200000

a *= 1000
a = 4200.000000


Am observat ca pentru operatiile de expresii, tot scoate zecimale de 9 din nimic si nu muta virgula zecimala iar pt atribuiri functioneaza bine pt 10 si 1000 (dar pt 100 nu)...


Titlul: Răspuns: Operatii ciudate cu numere zecimale
Scris de: MciprianM din Februarie 01, 2011, 13:42:41
4.2 e fractie zecimala periodica in baza 2 asa ca nu scoate cifre de 9 din nimic... Vezi aici (http://en.wikipedia.org/wiki/Floating_point) si aici: aici (http://ta.twi.tudelft.nl/users/vuik/wi211/disasters.html). Si printf face niste aproximatii, sunt mai multe chestii pe acolo, dar nu e nimic anormal acolo. Asta e floating point arithmetic.


Titlul: Răspuns: Operatii ciudate cu numere zecimale
Scris de: Robert Badea din Februarie 01, 2011, 23:00:04
Așa mă cruceam și eu când mă jucam cu preciziile.

Dacă puneam precizia de 4 sau mai puțin (parcă) îmi arăta bine, dar dacă puneam precizia mai mare umplea de 9.

Parcă era ceva de genul:
in: 3 out: 3.0000 //cu precizie 4
in: 3 out: 2.999999 //cu precizie 6


Titlul: Răspuns: Operatii ciudate cu numere zecimale
Scris de: Alexandru-Iancu Caragicu din Februarie 02, 2011, 13:14:09
4.2 e fractie zecimala periodica in baza 2 asa ca nu scoate cifre de 9 din nimic... Vezi aici (http://en.wikipedia.org/wiki/Floating_point) si aici: aici (http://ta.twi.tudelft.nl/users/vuik/wi211/disasters.html). Si printf face niste aproximatii, sunt mai multe chestii pe acolo, dar nu e nimic anormal acolo. Asta e floating point arithmetic.

Pai bine, dar de ce la atribuiri e cu totul altceva.
Adica daca inmultesti cu 100 apar cifre "in plus", dar daca inmultesti de 2 ori cu 10 nu apar.

E vreo alta metoda sa muti atunci virgula?