Ansicht:   

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

verfaßt von MudGuard zur Homepage 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.

--
[image]
MudGuard
O-o-ostern

 

gesamter Thread:

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