Forum: Mikrocontroller und Digitale Elektronik Artikel Festkommaarithmetik


von Rick M. (rick00)


Lesenswert?

Hallo!

Hab mich gerade durch den Artikel durchgearbeitet und mir ist folgender 
kleine "Fehler" aufgefallen:

Unter der Fkt. "my_round" steht folgendes:

"Die Funktion ist auch auf einen String anwendbar, welcher mit my_itoa() 
erzeugt wurde (also vorzeichenbehaftete Zahlen). Allerdings muss der 
Funktion ein Pointer auf das zweite Byte (char) übergeben werden, da im 
ersten das Vorzeichen gespeichert ist. Das geschieht am einfachsten so. 
"
1
my_round(my_string+1, 5);

Hierbei wird aber nicht berücksichtigt, daß

1.) sich der Index für die Rundung mit verschiebt.
es müßte folgendermaßen heißen:
1
my_round(my_string+1, 5-1);

2.) in der for-Schleife der Index für vorzeichenbehaftete Zahlen bis 10 
und nicht nur bis 9 laufen muß, da für Vorzeichenbehaftete Zahlen ein 
12Byte großes Feld benötigt wird.

Ich hab das volgendermaßen gelöst:
1
void round_32bit(char* string , uint8_t index_digit)
2
{
3
  
4
  uint8_t i , index_end;    
5
  
6
  
7
  if( (string[0] == '-') || (string[0] == ' ') )
8
  {                // vorzeichenbehaftete Zahl? (12Byte String)
9
    string+1;          // 1. Byte = sign -> Pointer auf 2tes Byte stellen
10
    index_digit-1;        // Index würde sich mitverschieben, daher korrektur
11
    index_end = 10;        // index_end für 12 Byte string
12
  }
13
  else
14
    index_end = 9;          // index_end für 11 Byte String
15
  
16
  
17
  if (string[index_digit] >= '5')      // muß aufgerundet werden ?
18
  {
19
    
20
    for (i= index_digit-1 ; i>=0 ; i--)  // einzelne Ziffern ansprechen
21
    {
22
      
23
      string[i] += 1;          // Ziffer aufrunden
24
      if (string[i] <= '9')      // wenn kein Übertrag Schleife verlassen
25
        break;
26
      
27
      else
28
        string[i] = '0';      // Übertrag + Überlauf
29
    }
30
    
31
  } 
32
  
33
  for (i=index_digit ; i<=index_end ; i++)    // gerundete Stellen auf Null setzen
34
    string[i] = '0';  
35
  
36
}

Gruß Rick

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.