Rechnung AWL

toto45

Level-1
Beiträge
65
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
der folgende Programmcode führt die folgende Rechnung durch:
Bei einer pos. Flanke von M 1.0:
Wert MD42 = Wert MD42 - 2^(Wert MD90)

Hinweis: 2^x = e^( ln(2) * x)

Setzt man in der Simulation vorher MD42 = 4 und MD 90 = 2 kommt nach betätigung von MB1.0 MD42 = 0 raus, was auch richtig ist.

Für MD42 = 134217728 und MD90= 27 sollte auch NULL rauskommen. Tut es aber nicht. Es gibt noch mehrere Wertepaare wo nicht Null rauskommt. Wieso?



U M 1.0
FP M 1.1
SPBN S14

L MD 90
T MD 80


L 2.000000e+000
LN
L MD 80

DTR
*R
EXP
RND
L MD 42

TAK
-D
T MD 42

S14: BE
 
Das Problem taucht genau dann auf, sobald das Ergebnis > als 7-8 Dezimalstellen wird,
mehr kann in einem REAL "single Precision" Zahlenformattechnisch nicht dargestellt werden.

Die Zahl mit der es hier z.B. nicht funktioniert hat 9 Dezimalstellen.

7 oder 8 hängt nun von der konkreten Zahl ab.

Mfg
Manuel
 
Hallo!

Warum berechnest du das 2^x eigentlich so kompliziert?
Es genügt ja wenn du in einem MD das erste Bit setzt und dann um so viele Stellen nach links Schiebst wie dein Wert im MD90 ist.
Natürlich bist du da mit 32 begrenzt, aber bis dahin kannst du alle Rechenoperationen im ganzzahligen Bereich durchführen und hast somit keine Ungenauigkeitsfehler.

godi
 
Nö das ist nicht seltsam.
Gleitpunktzahlen können ab einen gewissen Bereich nicht mehr Genau sein.
Dafür können sie einen größeren Wertebereich als ein Dint.
 
Das Merkerdoppel hat eine Auflösung von 32 Bit.

Deine Realberechnung arbeitet mit Zahlen nach IEEE754, also mit 23 Bit Mantisse, 1 Bit Vorzeichen und 8 Bit Exponent. Bleiben also nur die 23 Bit der Mantisse übrig; zusätzlich evtl. noch Rundungsfehler bleiben wohl 21-22 Bit.

Verglichen mit den 32 ist das doch 'ne schlechte Ausbeute.


Ausserdem hat godi's Vorschlag noch zwei Vorteile:
- Problemlos auf Werte breiter als ein Doppelwort erweiterbar.
- Erheblich schneller, da keine Fließkommaoperationen.
 
Zurück
Oben