TIA Real vergleichen...:= ABS(#In1 - #In2) <= (#EPSILON * (ABS(#In1) + ABS

jok3r

Level-2
Beiträge
370
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
kann mir jemand diese Annahme erklären ?

EPSILON = 1.0E-06


BOOL_Comp := ABS(#In1 - #In2) <= (#EPSILON * (ABS(#In1) + ABS(#In2)));

Ich hab das im Netz gefunden. Woher kommt der Datentyp - Rechenfehler EPSILON ?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Woher kommt der Datentyp
Der Datentyp BOOL kommt daher, weil das ein Vergleich "<=" zweier REAL-Ausdrücke ist.
Code:
BOOL_Comp := [COLOR="#008000"]ABS(#In1 - #In2)[/COLOR] [COLOR="#FF0000"]<=[/COLOR] [COLOR="#0000FF"](#EPSILON * (ABS(#In1) + ABS(#In2)))[/COLOR];

BOOL_Comp := [COLOR="#008000"]REAL_Ausdruck_1[/COLOR]  [COLOR="#FF0000"]<=[/COLOR] [COLOR="#0000FF"]REAL_Ausdruck_2[/COLOR]                     ;
#EPSILON muß vom Datentyp REAL sein, damit der rechte Ausdruck ohne Konvertierungen den Datentyp REAL ergibt.

Harald
 
Servus Harald du bist gerade komplett an der Frage vorbei :)

Das Thema ist REAL vergleichen:

Dass dieses Ergebnis ein Bool ist ;-) war mir auch klar.
Mir geht es nur um diesen Wert
-> EPSILON = 1.0E-06

Kann ich mir diese Rechenungenauigkeit herleiten?
Oder kommt die nur aus der Annahme das mich alles was kleiner ist nicht mehr interessiert?

Grüße

 
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus Harald du bist gerade komplett an der Frage vorbei :)
Servus jok3r, dann formuliere doch Deine Frage so, daß sie das ausdrückt was Du eigentlich wissen willst. :)

Ich vermute, die Formel soll ausdrücken, daß ein Addieren zweier REAL-Werte sinnfrei bzw. unmöglich ist, wenn die Differenz zu groß ist, weil das REAL-Format (IEEE 754) nur eine Genauigkeit von ca. 6 Ziffern hat.

Beispiel 1 unmöglich: Man kann z.B. nicht 1234560 + 0.01 rechnen --> da kommt wieder 1234560 raus.
Beispiel 2 ungenau: 1234567.0 + 0.890123 ergibt 1234568.0

Harald
 
Zuletzt bearbeitet:
Servus jok3r, dann formuliere doch Deine Frage so, daß sie das ausdrückt was Du eigentlich wissen willst. :)

Das ist wie mit den Programmierfehlern.
Man weiß es erst wenn es mal nicht funktioniert hat. :)

Letzteres das mit der Definition in der Norm IEEE 754 war mir neu. Und ist dann auch für mich so plausibel.

Danke

Grüße
 
)Letzteres das mit der Definition in der Norm IEEE 754 war mir neu. Und ist dann auch für mich so plausibel.

Gehört eigentlich zum Basiswissen, ist aber erstaunlich, wieviel bei Realzahlen darüber stolpern.
Ist ein ganz beliebtes Thema beim Aufaddieren von Verbrauchswerten bei Energiezählern :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Formel vergleicht den betragsmässigen Unterschied (=Differenz) der beiden Zahlen mit einem gewissen "Prozentsatz" der GrössenOrdnung der beiden Zahlen.
Es wird also geprüft, ob die beiden Zahlen annähernd gleich sind, wobei die Toleranz an die GrössenOrdnung der Zahlen angepasst wird.
Bei einer Mantisse von 24 Bit (23+1) = 2^24 = 16.777.216 ergibt sich eine "Granularität" von 1/16.777.216. "Dein" EpsilonWert = 1.0E-6 liegt darüber - sozusagen auf der sicheren Seite - und ist natürlich "Geschmackssache", sofern er nicht zu klein gewählt wird.
 
Gehört eigentlich zum Basiswissen, ist aber erstaunlich, wieviel bei Realzahlen darüber stolpern.
Ist ein ganz beliebtes Thema beim Aufaddieren von Verbrauchswerten bei Energiezählern :D

Ich weiß dir machen deine unterwürfigen blöden Kommentare Spaß;-),... die Fragestellung war nur woher die Zahl 1.0E-06 kommt. Die Problematik war mir nämlich nicht neu.

Und Tschüss.
 
... das REAL-Format (IEEE 754) ...
Der Link führt u.a. zu der Aussage ...
Damit können für die Vergleiche von Gleitkommazahlen dieselben Operationen wie für die Vergleiche von ganzen Zahlen verwendet werden. Kurz: die Gleitkommazahlen können lexikalisch sortiert werden.
So weit, so gut. Aber was bedeutet der nächste Satz:
Hierbei ist jedoch zu beachten, dass für steigende negative Ganzzahlwerte der entsprechende Gleitkommawert gegen minus unendlich geht, die Sortierung also umgekehrt ist.
???
Ich nix verstehen :oops:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hierbei ist jedoch zu beachten, dass für steigende negative Ganzzahlwerte der entsprechende Gleitkommawert gegen minus unendlich geht, die Sortierung also umgekehrt ist.
Weil: Die Mantisse wird nicht im Zweierkomplement gespeichert, sondern immer als vorzeichenloser/positiver Betrag + Vorzeichen-Bit.

Harald
 
Weil: Die Mantisse wird nicht im Zweierkomplement gespeichert, sondern immer als vorzeichenloser/positiver Betrag + Vorzeichen-Bit.
Und was soll ich nun deswegen beachten? Wer kehrt denn nun die Sortierung um?
Ob ich zwei Zahlen in ZweierKomplementDarstellung (z.B. 2 DINT-Werte) miteinander vergleiche oder 2 gültige REAL-Zahlen deren BitMuster ich in 2 DINT-Variablen schiebe ... ich finde kein Beispiel dafür, dass ich irgendetwas berücksichtigen/beachten müsste.
Die beiden Behauptungen hebeln sich doch gegenseitig aus - stimmt die eine, so kann die andere nicht stimmen - oder was habe ich falsch verstanden?

Anmerkung:
Was man natürlich nicht kann: für den Vergleich zweier UDINT-Zahlen die Vergleiche zweier DINT-Zahlen verwenden (ausser ==0 und <>0).
 
Zuletzt bearbeitet:
Damit können für die Vergleiche von Gleitkommazahlen dieselben Operationen wie für die Vergleiche von ganzen Zahlen verwendet werden. Kurz: die Gleitkommazahlen können lexikalisch sortiert werden.
Hierbei ist jedoch zu beachten, dass für steigende negative Ganzzahlwerte der entsprechende Gleitkommawert gegen minus unendlich geht, die Sortierung also umgekehrt ist.
Was ist gemeint mit "steigende negative Ganzzahlwerte"?? Was ist gemeint mit "entsprechender Gleitkommawert"??
Ich vermute, der Wikipedia-Autor wollte auf den Unterschied bei negativen Werten hinweisen:
Code:
L   "RealWert_1"      | 10.0 = 16#41200000 | -10.0 = 16#C1200000 | L#-100000000 = 16#FA0A1F00 = -1.792914e+035
L   "RealWert_2"      |  1.0 = 16#3F800000 |  -1.0 = 16#BF800000 |  L#-10000000 = 16#FF676980 = -3.075995e+038
>R
=   "groesserReal"    | true               | false               |  true
>D
=   "groesserGanz"    | true               |  true               | false
(wenn beide Werte positiv oder beide Werte negativ sind, dann ist egal, ob man die Bitmuster als signed INT oder unsigned INT vergleicht)

Harald
 
Zurück
Oben