AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi if-Abfrage mit Extended - Trotz gleichheit False
Thema durchsuchen
Ansicht
Themen-Optionen

if-Abfrage mit Extended - Trotz gleichheit False

Ein Thema von Captnemo · begonnen am 7. Nov 2012 · letzter Beitrag vom 8. Nov 2012
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 14:24
Hi,

mal wieder ein Phänomen, was ich mir so nicht erklären kann. Aber vielleicht könnt ihr mir auf die Sprünge helfen.

Ich habe eine Function, die verschiedene Werte auf gleichheit Prüfen soll.
Doch leider scheint das bei Datentyp Extended nicht zu klappen, obwohl laut Debugger der Wert gleich ist.

Ich habe mal einen Screenshot beigefügt, dann wird deutlich was ich meine. Der Code ist schrecklich, ich weiß. Ist nur für's debugging so geschrieben.
Miniaturansicht angehängter Grafiken
fehler.jpg  
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
flipdascript

Registriert seit: 20. Mai 2008
25 Beiträge
 
Delphi 2010 Professional
 
#2

AW: if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 14:29
Der für die Anzeige aufbereitete Wert ist gleich. Der in den Variablen stehende Wert ist es nicht.
Für Vergleiche von Fließkommazahlen solltest Du CompareeValue aus der Math-Unit verwenden.
  Mit Zitat antworten Zitat
sahimba

Registriert seit: 14. Nov 2011
Ort: Berlin, Hauptstadt der DDR
137 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 14:32
Hi,

Die Fließkommazahlen sind aufgrund ihrer internen Darstellung nicht exakt gleich (irgendwo an der gefühlt 190.000 Nachkomastelle), auch wenn der Debugger dies so anzeigen mag. Verwende die Funktion CompareValue, welche hier eine (minimale) Toleranz berücksichtigt.
Siehe: http://www.delphibasics.co.uk/RTL.asp?Name=CompareValue

Cheers,
S.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 14:43
Folgendes hatte ich mal zu dem Thema zusammen gesucht:


http://de.wikipedia.org/wiki/Rundungsfehler
http://de.wikipedia.org/wiki/Gleitkommazahl

Zitat:
Prüfung auf Gleichheit
Die im Abschnitt Dezimalzahlen genannte Einschränkung, dass viele Dezimalzahlen in Binärsystemen in Computern nicht exakt dargestellt werden können, hat beim Programmieren Auswirkungen auf Vergleiche zwischen Fließkommazahlen. Ein Beispiel in C soll dies verdeutlichen:
#include "stdio.h"
int main(){
if(.362*100. != 36.2)
printf("verschieden\n");

if(.362*100./100. != .362)
printf("auch verschieden\n");
return 0;
}
Obwohl die beiden Gleichungen und mathematisch korrekt sind, werden sie wegen der ungenauen Umrechnung ins Computer-Binärsystem falsch. Im Beispiel-Programm werden somit beide Ungleichungen als wahr angesehen.
Vergleiche müssen deshalb durch eine Abfrage ersetzt werden, ob die zu vergleichenden Werte im Rahmen einer erreichbaren Genauigkeit (meist Toleranz genannt) als gleich angesehen werden können.
Toleriert man beim Vergleich einen absoluten Fehler, lautet eine mögliche Formulierung .
Toleriert man beim Vergleich einen relativen Fehler, lautet eine mögliche Formulierung . Der zweite Fall muss meist noch mit der Sonderfallabfrage verbunden werden.
Sogar Zahlen mit exakt denselben Bitmustern und somit eigentlich exakt identischen Werten werden vom Rechner mit manchmal nicht als gleich angesehen. Das hat als Ursache die manchmal nicht identischen Formate im Speicher (Bsp.: Intel 64 Bit) und während einer Rechnung in der Gleitpunkteinheit (Bsp.: Intel 80 Bit). Wenn dieselben Bitmuster, die verglichen werden sollen, einmal aus dem Speicher und somit gerundet und einmal aus der FPU und somit mit der vollen Genauigkeit kommen, führt ein Vergleich zum falschen Ergebnis. Die Abhilfe ist dieselbe wie schon beschrieben.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#5

AW: if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 14:52
Jepp, das wars Super, vielen Dank. Hätt ich jetzt gar nicht gedacht.

Da der eine Wert aus einer MSSQL-DB stamt, der zweite jedoch aus einer Textdatei umgesetzt wird, wärs jetzt mal interessant, wer mir den Unterschied an x-ten Stelle da reinschummelt....ich fürchte mal des SQL-Server.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 16:34
Da schummelt keiner etwas rein - bzw. könnten sogar schon die Programme dafür "verantwortlich" sein, die diese Werte geschrieben haben. In Gänsefüßchen, weil letztlich immer nur die FPU, bzw. eigentlich die Bitbreite der FPU das wichtige ist. Die Ungenauigkeit ist im grundlegensten Prinzip der Fließkommarechnung begründet, und tritt immer und überall auf, wo Fließkommazahlen verwendet werden. Und jede einzelne Operation macht es schlimmer, so dass man (fast) sagen kann: Je mehr Rechenschritte eine Zahl durchlaufen musste, desto größer ist der Fehler im Vergleich zu einer hypothetischen Unendlich-Bit-FPU. Kommt noch Um- und Rückwandlung mit Strings dazu, wird es feierlich . Da gibt's keinen Schuldigen*, das ist einfach so.

*) Man kann komplexe Rechnungen z.T. geschickt genug aufbauen um die Aufsummierung der Fehler zu minimieren, aber gemacht wird er eigentlich immer.

PS: Das ist eigentlich etwas, was jedem Entwickler/Informatiker am ersten Tag von Ausbildung/Studium beigebracht werden müsste. Und dann täglich wiederholt, wenn man zugrunde legt, wie oft die Frage hier auftaucht =)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 7. Nov 2012 um 16:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Puke
Puke

Registriert seit: 7. Nov 2012
123 Beiträge
 
Delphi XE5 Architect
 
#7

AW: if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 16:41
Und wofür braucht man ultragenaue Rechnungen, die dann sowieso falsch sind?
Bisher runde ich auch Float-Zahlen zu Integer, die sind sowieso die einfachsten!
Gruß Puke
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 17:36
Hast Du schon mal etwas von Logarithmen gehört?
oder Rechenschieber?
Fließkommazahlen arbeiten nach dem gleichen Prinzip, so genau wie nötig.
Wenn Du es ganz genau haben willst dann mußt Du eben Currency oder ähnlich Typen nutzen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Puke
Puke

Registriert seit: 7. Nov 2012
123 Beiträge
 
Delphi XE5 Architect
 
#9

AW: if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 17:38
wie genau muss es denn sein?
Wenn die 5. Zahl noch bedeutend ist. Tschuldigung
allerdings kann man sonst runden oder den Wert mal 1000 nehmen und in ein Integer runden.
Gruß Puke
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: if-Abfrage mit Extended - Trotz gleichheit False

  Alt 7. Nov 2012, 19:56
wie genau muss es denn sein?
Wenn die 5. Zahl noch bedeutend ist. Tschuldigung
allerdings kann man sonst runden oder den Wert mal 1000 nehmen und in ein Integer runden.
Currency ist intern ein Int64 wo die letzten 4 Stellen als Nachkommastellen verwendet werden
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz