Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Operatii ciudate cu numere zecimale  (Citit de 1690 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Bit_Master
Vorbaret
****

Karma: -49
Deconectat Deconectat

Mesaje: 159



Vezi Profilul
« : 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)...
Memorat
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« Răspunde #1 : 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 si aici: aici. Si printf face niste aproximatii, sunt mai multe chestii pe acolo, dar nu e nimic anormal acolo. Asta e floating point arithmetic.
« Ultima modificare: Februarie 01, 2011, 19:49:08 de către Marginean Ninu Ciprian » Memorat
robert.badea
Strain


Karma: 2
Deconectat Deconectat

Mesaje: 16



Vezi Profilul
« Răspunde #2 : 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
Memorat
Bit_Master
Vorbaret
****

Karma: -49
Deconectat Deconectat

Mesaje: 159



Vezi Profilul
« Răspunde #3 : 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 si aici: aici. 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?
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines