| Autor |
Beitrag |
buSC
      
Beiträge: 39
|
Verfasst: So 31.01.10 17:24
Liebe forumer
angenommen folgende Zeilen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var i,flag:Integer; num,k,sum,step,zero:double;
begin sum:=0; zero:=0; num:=86; k:=num-zero; step:=k/10; for i:=1 to 10 do sum:=sum+step; if sum=k then Flag:=1; if sum<k then Flag:=2; if sum>k then Flag:=3; inc(i); end; |
das illustriert ein vefahren ,das im mein Program ausgerichtet worden ist,aber das Problem ist es ,dass bei mir der dritte Fall passiert, "Flag=3" . ist es ueberhaupt moeglich oder?
(wenn ich obengeschriebene Zeilen alleine ausfuehre ,passiert der zweite Fall.) wobei ich will dass der erste Fall passiert.
vielen Dank im Voraus
Moderiert von Gausi: Delphi-Tags hinzugefügt
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 31.01.10 17:34
Auf Gleichheit zu testen bei Gleitkommazahlen wird nix aufgrund des Dualsystems, das im PC verwendet wird und das Dezimalzahlen daher nicht exakt darstellen kann. Da gibt es die Funktion Math.SameValue, die du dafür nutzen kannst.
Zuletzt bearbeitet von jaenicke am So 31.01.10 17:35, insgesamt 1-mal bearbeitet
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 31.01.10 17:35
Das wird wieder das übliche Problem mit der Darstellung von Gleitkommazahlen im Rechner zu tun haben. Werte wie "Null Komma Eins" lassen sich zwar im Dezimalsystem "schön kurz" darstellen, aber nicht im Binärsystem des Rechners. man sollte daher niemals Float-Werte auf Gleichheit überprüfen, sondern immer mit einer gewissen Toleranz arbeiten. SameValue bietet sich dafür an. 
_________________ We are, we were and will not be.
|
|
buSC 
      
Beiträge: 39
|
Verfasst: Mo 01.02.10 17:01
erstmal vielen Dank an die beide Freunden, die mir geatwortet haben.
erstens:
wie ich verstanden habe,bei gleitkommazahlen kein exakte Gleichheit zu ueberpruefen ist.
zweitens:
wenn ich erste Zeile so aendere:
if SameValue(sum,k,0) then Flag:=1;
nach durchlauf von Zeile 12 ,Flag=1 ist
aber nochmal bei durchlauf von Zeile 13 wo sum<k ist, flag=2 wird.
Frage1:
ist es ueberhaupt moeglich ,dass der Fall sum>k ,passiert?
Frage2:
wenn ich null als dritte argument von "sameValue" function einfuege,ist es noch kein exakte Gleichheit oder?
und was ist der unterschied ,wenn ich die einfache gleichheit symbol verwende(d.h.: '=') und wenn ich null als dritte argument von sameValue verwende.
frage3:
ob es Gevrauch von aehnilchem funktion fuer die gleichheit-ueberpruefung von dezimalzahlen,wie " CompareValue" funktion noetig ist?
und wenn ja,wann kann ich bei gleichheits-Ueberprufung von dezimalzahlen,das symbol ,'=' ,verwende, und wann muss ich diese funktion verwende?
vielen Dank im Voraus
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: Mo 01.02.10 17:14
AFAIK Ordinale Typen kannste mit = vergleichen, sowie Currency-Werte. Alle anderen realen Typen nicht.
_________________ mfg. Joel
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mo 01.02.10 17:58
Du kannst aber folgendes machen, Vorzeichen Prüfen
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (sum - k) = 0 then Flag := 0 else if (sum - k) > 0 then Flag := 1 else if (sum - k) < 0 then Flag := 2; |
wenn ich es noch so in erinnerung habe
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
buSC 
      
Beiträge: 39
|
Verfasst: Mi 03.02.10 17:59
Danke an alle Freunde fuer Ihre Antworte,
2 wichtige Frage fuer mich waeren:
erste:
bei Gleichheitstest von Gleitkommazahlen ,ist es ueberhaupt logisch der symbol "=" zu verwenden ,oder ist es ein muss immer die Funktion "math.sameValue" zu verwenden?
zweite:
wie erklaert sich der gleiche Fall bei dezimalzahlen?
ich ware dankbar ,wenn ich die beide Antworten wissen duerfte.
danke im Voraus
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 03.02.10 18:31
Kurz und simple
Das Dualsysthem kennt keine Kommastellen.
Um einen Vergleich auf '=' zumachen, müsste die Funktion, die ganzZahl vor dem Komma auf 0 testen und die stellen nach dem Komma ebenfals auf 0 testen. (ganz simple ausgedrückt) und dies wird in der Funktion auf '=' nicht gemacht.
Die Funktion "math.sameValue" wurde desahlb implementiert weil sie es dann so macht.
und Ganzahl ist ja wohl klar.
Darum habe ich ja oben mal ein altes Beispeile angebracht wie es auch noch geht!
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 03.02.10 19:29
_________________ We are, we were and will not be.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 03.02.10 23:52
Ich bezog das doch auf den Rechner/PC, mit dem Dualsysthem.  oder war es das Binärsysthem !?
Den der kennt wirklich keine Komma stelle.
Oder ich habe die Fragestellung halt nicht verstanden!?.
So wie ich aber weiss, spielt es keine Rolle, bei
k = s
k > s
k < s
wie oder mit was das Ergebnis von k und s zustande kam.
Es sei denn, ich will wissen, ab wann es zu unterschiedlichen Ergebnissen kommt.
wie Dein Beispiel es zeigt! Gausi
Hab mich vielleicht blöd ausgetrückt
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 04.02.10 01:19
|
|
|