Ansicht:   

#156658 C - seltsamer Rundungseffekt ??? (pc.coding)

verfaßt von Mr. Teflon, 12.08.2009, 21:40:44

> Hi,
>
> mal ne Frage vorweg. Welchen Compiler verwendest Du. Bei den meisten
> kannst Du nämlich im Debugmode die Werte anzeigen lassen. Ein paar
> Breakpoints und dann durchgesteppt und schon passts.
>
> Was ich aber nicht verstehe ist folgendes
>


> 
> >
> >    if(wert2 > 9.99)				// wenn Temperatur kälter wie -99°C, dann 
> >      wert2 = 9.99;				// wird Anzeige auf -99,9°C gesetzt
> > 	  
> >    D = wert2;	
> 


> hier wird D zu 9.99
>
>

					
> >    com_txd (D + 48);				// Zehner Stelle als Ganzzahl an COM
> >    
> >    wert2 = wert2 - D;						
> 


> hier weist Du wert2 die Subtraktion von wert2 und D zu also:
> wert2=9.99-9.99. Soll das so sein oder fehlt noch was in dem Code. Mal
> davon abgesehn dass keine deklaration für D vorhanden ist?
>
> Ansonsten wie MudGuard geschrieben hat mal ne printf oder sprintf
> versuchen.
>
> Gruß LEO
>
> Gruß LEO

Hallo,

unsigned char D;

wert2 ist 9,99

D = wert2; >>> D wird wegen Ganzzahl 9, nicht 9,99

Also die 1. Stelle vorm Komma. Darum muß \"wert2\" bei der ganzen \"Zahlenweiterschubserei\" vorm Komma einstellig bleiben, sonst klappt das nicht.

Dieses \"Schieberegister\" ist nicht von mir, ich habe es jedoch verstanden wie funktioniert. Das verstehen ist mir erstmal wichtig. Geht bestimmt auch einfacher. Es gibt da noch so eine Funktion \"ltoa_format\", die verstehe ich aber bis jetzt nicht.

Ich werde mich wegen printf und sprintf schlau machen.


//*************************************   Long in Zeichenkette umwandeln  
int ltoa_format(char *erg, long zahl, uint vk, uint nk,  char vorz )
{ // Out-String, Eingabe, Vorkommastellen, Nachkommastellen, Vorzeichen \'+\' oder \' \' 
   long temp;
   int  i;
   i = vk + nk + 1;                    // Stringlaenge  
   erg[i--] = 0;                       // Zeichenketten-Ende  
   if ( zahl == 0 ) erg[i--] = \'0\';    // Spezialfall 0  
   else 
   {
      if ( zahl < 0 )
      {
      vorz  = \'-\';                     // negatives Vorzeichen  
      zahl *=  -1;                     // mit positiver Zahl weiterrechnen 
      }
      while( i >= 0 && 
	       ( zahl > 0 || i+2*( nk != 0 ) > vk) ) // in vk ist vorz enthalten  
      {
      if (i==vk&&nk!=0) erg[i--]=\'.\';  // Dezimalpunkt, wenn nk abgearbeitet  
      else 
      {
      temp     =  zahl / 10;           // ganzzahlige Division  
      erg[i--] = (zahl - temp*10) + 48; // Digit abtrennen und ASCII Zeichen ablegen */
      zahl     =  temp;                // fuer naechsten Durchlauf um 1 Digit verkuerzt */
      }
   }
   if ( i >= 0 ) erg[i--] = vorz;      // Vorzeichen schreiben  
   }
   while( i >= 0 ) erg[i--] = \' \';     // Anfang mit Leerzeichen fuellen  
   return  vk + nk + 1;                // Stringlaenge zurueckgeben  
}

--
___________
Tschau
Mr. Teflon

 

gesamter Thread:

Ansicht:   
Auf unserer Web-Seite werden Cookies eingesetzt, um diverse Funktionalitäten zu gewährleisten. Hier erfährst du alles zum Datenschutz