verfaßt von MudGuard , München, 12.08.2009, 07:48:39
> 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 !!!
> // ********** -30°C ... 0°C zweistellig und 0°C ... 150°C dreistellig
Außerdem ist -99.9 außerhalb dieses Bereichs ...
> 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.
gesamter Thread: