mikrocontroller.net

Forum: Compiler & IDEs Genauigkeit float


Autor: prakti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann mir jemand aus dem Stegreif sagen, was avr-gcc daraus macht?
 1.006437 -5.248084e-08 = ?

Ich fuerchte an die Grenzen der Genauigkeit gestossen zu sein. Was kann 
man dann noch machen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
prakti schrieb:
> Hallo,
>
> kann mir jemand aus dem Stegreif sagen, was avr-gcc daraus macht?
>  1.006437 -5.248084e-08 = ?

In Bezug auf 1.0 sind 5e-08 praktisch 0. Zumindest mit float

> Ich fuerchte an die Grenzen der Genauigkeit gestossen zu sein.

Du meinst Auflösung.

> Was kann
> man dann noch machen?

Ansprüche zurückschrauben.
Die Berechnung noch einmal als Ganzes durchgehen. Sich überlegen, ob es 
tatsächlich notwenig ist, von 1 ein 100-Millionstel abzuziehen. Wie 
verändert sich das Gesamtergebnis wenn du es nicht tust?
Berechnungen umstellen

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 24 bit Gleitkomma-Mantisse hast du 6...7 Dezimalstellen an
Auflösung.  Eine Subtraktion von 1E-8 von 1 wird sich also im
Ergebnis nicht mehr niederschlagen.

Entweder Festkommarechnung oder du kannst dich auch mal umsehen,
es gibt auch Bibliotheken, die mehr als 32-bit-FP implementieren,
da hast du dann nur keinerlei Compiler-Unterstützung dafür, also
sowas wie

my64bitfp_t maybe_pi = 3.141592618281828;

geht dann nicht.

Autor: Dominik R. (domy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,
wenn du genau wissen willst was mit deiner Zahl passiert dann schau in 
der IEE754 nach, da sind die Gleitkommazahlen exakt definiert, bei dir 
wäre das mit single precision:
- Exponent: 8bit
- Mantissa: 23bit
- Sign:     1bit

Wandle deine Zahle selbst mal von Hand in dieses Format um und schaue 
was herauskommt, so geht man an die Sache ran.

Jetzt einmal eine ganz andere Frage: Findest du nicht, dass deine 
Rechnung unnötig ist? Brauchst du denn diese Genauigkeit und auf wie 
viele Stellen genau ist deine 1.006437??? hast du die Zahl gerundet oder 
sie wirklich auf 14 Nachkommastellen genau berechnet so wie deine zweite 
Zahl? Denn nur dann würde diese Rechnung ansatzweise Sinn machen.

Gruß Dominik

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich gehe davon aus, daß das minus vor der 5 eine Rechenoperation 
darstellen soll.
Eine normale Float hat etwas 7-9 signifikante Stellen wenn ich mich 
recht erinnere. Also bist Du definitiv im Bereich der Genauigkeit bei 
dieser Operation.
Wenn Du größere Genauigkeit brauchst nimm double statt float, dann hast 
du ca 16 signifikante Stellen.
Es gibt auch Möglichkeiten mit entsprechend großen BCD codierten Zahlen 
eine fast beliebige Anzahl signifikanter Stellen zu erhalten, allerdings 
braucht man die entsprechende Bibliothek oder muss sich die 
Rechenoperationen selbst schreiben.
Dir Frage ist wie genau macht Deine Rechnung Sinn? Manche 
Rundungsprobleme kann man in den Griff kriegen indem man bei der 
Rechnung eine günstigere Reihenfolge wählt.

Autor: prakti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke fuer die Bestaetigung und Korrektur!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
U.R. Schmitt schrieb:
> Wenn Du größere Genauigkeit brauchst nimm double statt float

Nein.  Er schrieb was von AVR-GCC.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Entweder Festkommarechnung oder du kannst dich auch mal umsehen,
>>es gibt auch Bibliotheken, die mehr als 32-bit-FP implementieren,

Beitrag "64 Bit float Emulator in C, IEEE754 compatibel"

;-))

Cheers
Detlef

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.