MudGuard schrieb am 12.August.2009, 07:48:39 in der Kategorie pc.coding
C - seltsamer Rundungseffekt ???
> Ich begrenze die Ausgabe/Anzeige auf -99,9°C. Mit der Abfrage > > if(wert2 > 9.99) > wert2 = 9.99;
Das finde ich schon mal verwirrend - wieso 9.99, wenn es -99.9 sein sollen?
> Die Zahl wird nur noch in Einzelteile zerlegt, sodass eigentlich im > Terminal -99.9 ankommen/angezeigt werden müßten. > ABER! Ich bekomme -99,8 angezeigt !!!
> wert2 = (float) ad_in(chan); // A/D Wandler auslesen und als float
> if(wert2 < 231) // wenn Temperatur negativ, dann hier rechnen
231 ist doch nicht negativ. Sehr seltsam ...
> if(wert2 > 9.99) // wenn Temperatur kälter wie -99°C, dann > wert2 = 9.99; // wird Anzeige auf -99,9°C gesetzt
> D = wert2; > com_txd (D + 48); // Zehner Stelle als Ganzzahl an COM > > wert2 = wert2 - D; > wert2 = wert2 * 10; > D = wert2; > com_txd (D + 48); // Einer Stelle als Ganzzahl an COM > > com_txd (0x2e); // Dezimalpunktausgabe an COM
Bei der ganzen Rechnerei können jedesmal Rundungsfehler geschehen - beachte dabei insbesondere, daß nicht jede Dezimalzahl im zugrundeliegenden Binärformat exakt darstellbar ist. So wie z.B. 1/7 im Dezimalsystem eine nicht-endliche Darstellung hat ( 0,142857 142857 142857 142857 142857 usw.), gibt es Zahlen, die im Binärsystem eine nicht-endliche Darstellung haben - da der Speicherplatz für die Zahl aber endlich ist, wird dann gerundet).
> wert2 = wert2 - D; > wert2 = wert2 * 10; > D = wert2; > com_txd (D + 48); // erste Kommastelle als Ganzzahl an COM
> > // com_txd (176); // Zeichen ° an COM > com_txd (\'C\');
Steht sprintf oder printf zur Verfügung? Damit kannst Du die Fließkommazahl in einen String umwandeln, ohne den Wert dabei durch mehrfache Berechnungen zu verändern.