Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Rundungsfehler bei Floatoperationen? Kategorie: Programmierung Basic (von Montelucon - 1.12.2008 0:33)
Als Antwort auf Re: Rundungsfehler bei Floatoperationen? von PeterS - 30.11.2008 23:02
Ich nutze:
C-Control Pro Mega32, CC-Pro 32 Application Board
Hallo Peter,

danke, das hilft mir weiter. Dann wandel ich alles in Integer um und rechne damit.


GruÃ?

Monte


> > Hallo,
> >
> > leider eine mega groÃ?es Problem.
> >
> > Ich habe eine Uhr realisiert, die leider bereits nach sehr kurzer Zeit immer ungenauer wird.
> > Am Anfang dachte ich es liegt an der Taktfrequenz die durch einen ungenauen Quarz abweicht.
> > Doch es scheint an Rundungsfehlern zu liegen.
>
> Hallo,
>
> bei float Zahlen kann es immer zu Rundungsfehlern kommen. Aus der Wikipedia:
>
> "Durch die unterschiedliche binäre Darstellung der Zahlen kann es in beiden Systemen zu Artefakten
> kommen. Das heiÃ?t: Zahlen, die im Dezimalsystem â??rundâ?? erscheinen, zum Beispiel 12,45, können im
> Binärsystem nicht exakt dargestellt werden. Statt dessen wird ihre Binärdarstellung abgeschnitten, so
> dass man bei der Rückumwandlung ins Dezimalsystem den Wert 12,44999999900468785 erhält. Dieses
> kann in nachfolgenden Berechnungen zu unvorhergesehenen Ab- oder Aufrundungsfehlern führen."
>
> Entweder multiplizierst Du hoch und schneidest dann ab, oder besser noch verzichte auf float Zahlen.
> Floating Point in 8-Bit CPUs wie den Mega32 oder Mega128 sind SEHR langsam und sollten falls möglich
> vermieden werden.
>
> Gruss Peter
>
>
> >
> > Beispiel:
> > -------------------------------------------------------------------------------------------------------------
> > Dim test As Single
> > Dim hochrunter As Single
> > Dim schrittweite As Single
> >
> > Sub main()
> >        test = 35.0
> >        hochrunter = -1.0
> >        schrittweite = 0.2
> >
> >       Do While 1
> >            rechne()
> >       End While
> > End Sub
> >
> > Sub rechne()
> >        test = test + (hochrunter * schrittweite)
> > End Sub
> > -------------------------------------------------------------------------------------------------------------
> >
> > Das Ergbnis ist leider nicht wie erwartet:
> >
> > test = 34.80000
> > test = 34.60000
> >
> > sondern
> >
> > test = 34.79999
> > test = 34.79998
> > usw.
> >
> > Was mache ich falsch, bzw. was kann ich machen um den Fehler zu beheben?
> >
> >
> > GruÃ?
> >
> > Monte
> >
> >
> >


    Antwort schreiben


Antworten: