Der vorige Ansatz war nur als Ideenspender gedacht, er funktioniert bei
manchen Werten nicht korrekt (z.B. wird statt 0,210 0,20: ausgegeben).
Deshalb hier eine neue Version:
von den 1024 Werten weichen 26 um 0,001 vom korrekt gerundeten Wert ab,
damit kann man leben.
1 | register unsigned int i;
|
2 | register char c;
|
3 | i=( x<<6)+6;//Schieben entfällt bei ADLAR=1, +6: runden
|
4 | //i=(1023<<6)+6;//Test: ergibt 4,995
|
5 | c='0';
|
6 | while(i>=13107){c++;i-=13107;} //13107.2
|
7 | putch(c);putch(',');
|
8 |
|
9 | c='0';i+=i*4;i-=2; //das selbe wie i=i*5-2; (-2: Korrektur, da vorher Nachkommastellen abgeschnitten wurden)
|
10 | while(i>= 6553){c++;i-= 6553;} //6553.6
|
11 | putch(c);
|
12 |
|
13 | c='0';i+=i*4;i*=2;i-=2; //das selbe wie i=10*i-2; aber kürzerer Code
|
14 | while(i>= 6553){c++;i-= 6553;}
|
15 | putch(c);
|
16 |
|
17 | c='0';i+=i*4;i*=2;i-=2;
|
18 | while(i>= 6553){c++;i-= 6553;}
|
19 | putch(c);
|
Das alternativ Subtrahieren / Addieren habe ich absichtlich nicht
gemacht, da das Vorzeichen-Bit ein Bit Genauigkeit kostet.