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 | ||
| ||
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: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum