Thema: FreePascal Vergleich von Zahlen

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#10

AW: Vergleich von Zahlen

  Alt 3. Mär 2020, 17:19
Aber ich vermute das du auf
Code:
IF error then
anspielst? Da so eh der Vergleich auf TRUE gemacht wird?
Im Prinzip ja, aber

Boolean ist 1 Byte groß und kennt somit 256 verschiedene Werte.
Die Konstanten True und False sind jeweils als ein Wert definiert (0 oder 1 und z.B. im C++ auch gern als -1 statt 1)
1 = ein Bit aktiv
-1 = alle Bits aktiv

Die Auswertung eines BOOLs sieht aber anders aus
ist 0 = False
nicht 0 = True

Tja, und nun kann es vorkommen, dass du von irgendwo ein "anderes" True bekommst und somit dein =True nicht mehr trifft.
Delphi-Quellcode:
var
  B: Boolean;
begin
  //B := False;
  //B := True;
  B := Boolean(2);

  if B then
    ShowMessage('1: True');
  if not B then
    ShowMessage('1: False');

  if B = True then
    ShowMessage('2: True');
  if B = False then
    ShowMessage('2: False');
  if B <> False then
    ShowMessage('3: True');


Zitat:
So grob funktioniert das jetzt sogar. Allerdings scheint meine Funktion, die mit den String mit Dezimalpunkt in ein Float umwandelt (hier im Forum gefunden) die Nachkommastellen abzuschneiden.
Was kommt wohl raus, wenn der String mal Beides drin hat?
z.B. 123.456,78
Dann knallt es.

StrToFloat hat einen Parameter FormatSettings, den sollte man verwenden, wenn man ein bestimmtes Format haben möchte, welches nicht unbedingt der aktuellen Systemsprache entspricht.


Zitat:
Delphi-Quellcode:
  for j := 1 to i - 1 do
  begin
    if MyStrToFloat(Targets[j]) - MyStrToFloat(Targets[j - 1]) = m then
      l := True
    else
      l := False;
  end;
Wenn ich hier mal den "unnötigen" Teil entferne, wem fällt da auf, was in der Schleife schief laufen kann?
Delphi-Quellcode:
  for j := 1 to i - 1 do
  begin
    l := MyStrToFloat(Targets[j]) - MyStrToFloat(Targets[j - 1]) = m;
  end;
Delphi-Quellcode:
  if i > 2 then // if i - 1 > 1 then
    l := MyStrToFloat(Targets[i - 1]) - MyStrToFloat(Targets[i - 2]) = m;

Genau, alle nachfolgenden Durchläufe überschreiben diese Variable und somit wird nur das Letzte ausgewertet.

Bei z.B. 0.000000 100.000000 123456789.012 -666 300.000000 400.000000
also 0.000000 100.000000 ... irgendwas ... 300.000000 400.000000 (2 vorn und 2 hinten gleich weit entfernt)
schlägt deine Prüfschleife fehl.

Ich vermute das else l := False; ist so nicht gewollt und wenn es dann eh schon TRUE ist, dann kann es nicht noch TRUEr werden, also könnte man beim ersten True die Schleife abbrechen (Break).


Da Fließkommazahlen Rundungafehler enthalten können, aufgrund der binären Speicherung von dezimalen Zahlen und der gegrenzten Anzahl von Bits,
Vergleiche immer nur mit IsZero, Delphi-Referenz durchsuchenSameValue, CompareValue und Dergleichen, mit einem "angemessenen" Delta.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 3. Mär 2020 um 18:18 Uhr)
  Mit Zitat antworten Zitat