XYZ schrieb:
> -Wie genau ist die Fließkomma-Berechung mit double und float, bzw. sind
> diese Typen tatsächlich identisch in avr-gcc,
Erst mal: Mit dem WinAvr, also dem freien gcc Compiler, sind auf einem
AVR float und double tatsächlich gleich groß: 4 Bytes
Das ist aber vom Compiler abhängig. Andere Compiler mögen das anders
sehen.
> also wie viele
> Nachkommastellen werden berücksichtigt?
Die Anzahl der Nachkommastellen ist bei Floating Point uninteressant.
Wichtig ist, wieviele signifikante Stellen (also Stellen insgesammt) du
zur Verfügung hast. Bei float geht man von ungefähr 5 bis 6
signifikanten Stellen aus.
Dh. die Zahl 1234.56
wird noch einigermassen sauber darstellbar sein. Eventuell ist auch die
3. Nachkommastelle noch brauchbar (ja nachdem wie die Vorgeschichte der
Zahl aussah), aber alles dahinter ist dann mehr oder weniger nur noch
gelogen.
> Beim direkten Eingeben der
> Nachkommastellen scheinen die Zahlen wesentlich genauer zu sein, als vom
> Mikrocontroller errechnete Werte.
Das ist ziemlich normal.
Mit jedem Rechenvorgang verlierst du ein bischen was (*)
Rechnen mit Floating Point ist wie das Umschaufeln eines Sandhaufens.
Je öfter man es macht, desto mehr Sand verliert man und desto mehr
Schmutz bekommt man.
> Kann es sein dass der Compiler bei
> komplizierteren Berechnungen einfach weniger Stellen berechnet?
Nein. Es wird immer mit der gleichen Bitzahl gerechnet. Aber es ist nun
mal das Wesen von Floating Point, dass sie nur eine Näherung dessen
sind, was du in der Mathematik als rationale Zahlen kennst.
Im Normalfall sollte man sich auf einem µC sehr gut überlegen, ob man
überhaupt Floating Point benutzen will. Meistens ist es unnötig.
> Ich hatte ein perfekt funktionierendes Programm mit einem aus 500 Bytes
> bestehendem Array und einer Gesamtgröße von 3 kByte. Lediglich durch das
> Einfügen eines Arrays aus 2000 float Variablen funktionierte das
> Programm plötzlich nicht mehr, obwohl die Gesamtgröße ca. 11 kByte war.
Da wirst du wohl irgendwo einen Fehler gemacht haben, bzw. die
Gesamtgröße deines Programms ist größer als ein techologisches Limit
geworden (Flash, SRAM, ... )
> Der Compiler zeigte jedoch keinen Fehler an.
Das ist dem Compiler auch normalerweise egal. Wenn überhaupt, dann
interessiert das den Linker. Aber im Normalfall ist es dein Bier dafür
zu Sorgen, dass du alles im Speicher unterbringst.
(*) wobei sich dieses 'bischen was' je nach konkreten Zahlenwerten auch
mächtig aufblähen kann.