Hallo miteinander,
ich habe ein etwas mystisches Problem mit Fließkomma-Berechnungen.
Bevor nun jemand die Glaskugel hervorkramen muss: ;-)
- Prozessor: ADuC834
- Compiler: KEIL: C51.exe X3.35 vom 21.12.1992
- Linker: KEIL: L51.exe V2.8 vom 2. 1.1991
- Libraries: KEIL: C51S.lib und C51FPS.lib vom 23. 9.1991
- Pragmas: code symbols small regparms
Die Firmware macht folgendes:
- eine Temperatur (float!) messen und in bestimmten Abständen (ca. 10
Sek.) im Flash speichern (float!)
- nach jeder Temperatur-Messung folgende Berechnung ausführen:
y += P1 hoch (AT - P2)
'y' ist eine globale Variable und wird bei Start der Messung auf 0
gesetzt. P1 und P2 sind zwei globale Parameter (float!), die während der
Messung konstant sind. AT ist die aktuell gemessene Temperatur (float!).
P1 liegt so bei 1.2F und P2 bei 50.F
der Source-Code dazu ist:
1 | y += pow(P1, (AT - P2));
|
am Ende der Messung wird 'y' gespeichert und zur PC-Software übertragen.
Auf dem PC läuft eine ebenfalls von mir geschriebene Windows-Software
(geschrieben mit Microsoft Visual Studio 2008, C++),
die nun alle gespeicherten Temperaturwerte aus dem Flash des ADuC834
ausliest (über RS232) und auf Harddisk speichert.
Lasse ich nun die PC-Software 'y' berechnen (alles in float!):
1 | y = 0;
|
2 | for(i=0; i<maxwerte; i++) {
|
3 | y += pow(P1, (T[i] - P2)); // T[i] ist die Temperaturmessreihe!
|
4 | }
|
so kommt bei einer Messreihe mal der gleiche Wert wie im ADuC835, bei
einer anderen Messreihe aber auch ein stark abweichender (ca. 30%
höherer) Wert heraus.
In Excel transferierte Messreihen ergeben dort immer den gleichen Wert
für 'y' wie in meiner Windows-Software, so dass ich den Rechenfehler im
ADuC834 vermute.
Hat jemand schon Erfahrung mit der Rechengenauigkeit der
Keil-Floating-Point-Emulation?
Könnte es sein, dass bei sehr kleinen Exponenten
(Temperatur-Differenzen) oder negativen Exponenten die Keil-Library
schwächelt?
Viele Grüße
Peter