Problem muze byt v zaokrouhlovani - 0.9 nema konecny binarni rozvoj a vysledek prekladace na PC a vysledek Arduina za chodu se muze drobne lisit (jak v delce rozvoje, tak v zaokrouhleni konce a v operacich okolo normalizaci)
Kód: Vybrat vše
0.9 /2 = 0, zb 0.9 (*2=1.8) =>0.
1.8 /2 = 0, zb 1.8 (*2=3.6) =>0.0
3.6 /2 = 1, zb 1.6 (*2=3.2) =>0.01
3.2 /2 = 1, zb 1.2 (*2=2.4) =>0.01 1
2.4 /2 = 1, zb 0.4 (*2=0.8) =>0.01 11
0.8 /2 = 0, zb 0.8 (*2=1.6) =>0.01 110
1.6 /2 = 0, zb 1.6 (*2=3.2) =>0.01 1100
3.2 /2 = 1, zb 1.2 (*2=2.4) =>0.01 1100 1
2.4 /2 = 1, zb 0.4 (*2=0.8) =>0.01 1100 11
0.8 /2 = 0, zb 0.8 (*2=1.6) =>0.01 1100 110
1.6 /2 = 0, zb 1.6 (*2=3.2) =>0.01 1100 1100
...
Podobny problem jako zapsat v desitkove soustave 1/3 (zkus si na kalkulacce spocist 1/3 a vysledek (opsat a) vynasobit 3 - muze ti to vyjit taky 0.9999999, nebo to muze kalkulacka zaokrouhlit, nebo to muze ukazat zaokrouhlene a kdyz od toho pak odectes 0.999 a vynasobis 1000, tak se to najednou rozvine (a nejde rict, ze je to "spatne implementovane" proste mas omezenou presnost) - a zkus si to vypocist v ruce, kde to muzes zoptimalizovat na na 3/3*1 = 1 ) - proto se pri pocitani s float (ci s vyrazy, kde se float muze jako mezivysledek objevit) nedoporucuje bezmyslenkovite pouzivat "==", "<", "<=" ... , ale zvazit, zda neni potreba misto "a==b" pouzit radeji neco jako "( (a+0.1) > b ) && ( (a-0.1) < b )" (nebo misto 0.1 pouzit jinou hodnotu pro "prijatelnou chybu pri zaokrouholovani")
Rozvoj jde do nekonecna, kazda funkce se musi nekde zastavit, musi najit prvni 1 ve vypisu, podle ni upravit exponent a ulozit ten zbytek za ni a exponent jako binarni reprezentaci toho float, kdyz ho spocita prekladac (tedy float a) a ulozit si ho po konverzi na string a nasledne konverzi na float do jine promenne
Kód: Vybrat vše
float c=0;
c= (String(a,1)).toFloat()
// vypsat reprezentaci a
// vypsat reprezentaci c
// vypsat a==c