PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Singlevariable hochzählen - zunehmender Fehler



enterprise30
22.06.2008, 14:12
Hallo zusammen!

Ich addiere in einer Singlevariablen einen kleinen Zahlenwert (0,00027) fortlaufend auf.
Das geht auch soweit ganz gut.
Jedoch wird bei bei jeder Verschiebung des Kommas nach rechts ein Stückchen meines kleinen zu zählenden Zahlenwertes abgeschnitten und dadurch ungenauer bzw. mit einem größer werdendem Fehler addiert.
Ist mein Zählerstand ausserdem bei 4096 angekommen, so wird der Zahlenwert nicht mehr aufaddiert; der Zähler bleibt stehen.

Frage: Wie kann ich die kleinen Zahlenwerte genauer und vor allem mit mehr Stellen addieren?

...

Jaecko
22.06.2008, 14:55
Das ist eines der Probleme, wie zahlen im PC/Controller gespeichert werden; da gibts nur ne beschränkte Genauigkeit.
Ein Versuch wäre mal, statt Single einfach Double zu verwenden.
Ne andere Möglichkeit: Ne Integer-Variable hochzählen, wie oft die 0,00027 addiert werden sollen; erst wenn das Ergebnis dann benötigt wird, direkt ausrechnen, also z.B. statt 500x zu schreiben y = y + 0,00027 einfach das hier:

y1 = y1 + 1 (oder INCR y1)
y2 = 0.00027

Wird das Ergebnis gebraucht: y = y1 * y2

enterprise30
22.06.2008, 15:44
Das mit dem Double hab ich schon ein wenig probiert - hat aber nicht so recht hingehauen.
Was ich vergaß zu sagen: Die "0,0027" ist nicht konstant, sondern ändert sich laufend. Das sind kleine Stückchen Amperstunden die sich in Abhängigkeit vom Strom laufend ändern.
Ansonsten ist Dein Vorschlag gar nicht ohne - werd ich mir merken =D>
Ich hab mir jetzt vorläufig so geholfen:
Wenn die Singlevariable den Wert >= 1 erreicht wird diese gelöscht und eine Long-Variable inkrementiert.
Nachteil: Je größer die "Stückchen" werden, desto höher wird der Fehler da ja der Wert ">=1" im Normalfall ein paar Nachkommastellen enthält die dann abgeschnitten werden.
Vielleicht fällt mir noch was besseres ein! :-k

...

PicNick
22.06.2008, 16:05
..wird diese gelöscht und eine Long-Variable .

Du mußt ja nicht löschen. Ziehe 1.00000 davon ab.

Gock
22.06.2008, 18:48
Wieso rechnest Du nicht mit ganzen Zahlen (27 usw) und teilst am Ende durch 10000? Dann kannst Du Dir die Fließkommas bis auf die letzte Rechnung sparen. Besser natürlich noch mit Vielfachen von 2^x rechnen.
In physikalischen Standard-Einheiten zu rechnen ist meist ineffizient. Am besten rechnet man am Ende erst um.

for_ro
22.06.2008, 18:53
Was ich vergaß zu sagen: Die "0,0027" ist nicht konstant, sondern ändert sich laufend. Das sind kleine Stückchen Amperstunden die sich in Abhängigkeit vom Strom laufend ändern.

Du wirst aber nicht den Wert 0,0027 messen, sondern doch wohl über den ADC einen Wert zwischen 0 und 1023 bekommen und diese dann umrechnen.
Dann kannst du aber auch die ADC Wert in einer Long Variable addieren und später dann die Rechnung auf der Summe ausführen.
Das ist dann doch so wie Jaecko vorgeschlagen hat.

Gruß

Rolf

enterprise30
22.06.2008, 21:00
He-He-He!!!
So viele Vorschläge :-)
Ich hab eben mal (den ganzen Sonntagnachmittag *g*) meine Variante aus meinem 2. Beitrag getestet.
Ergebnis: Fehler ist kleiner 0,1% - damit kann ich leben.
@Gock: Das wär´s natürlich auch gewesen - schade daß ich den Beitrag erst jetzt gelesen hab - jetzt hab ich die Berechung schon fertig.
Aber ich werd mir Deine Variante natürlich merken (echt clever!)
Also Danke nochmal an alle!!!!

Grüße, Jürgen