AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein gerundete Zahlen werden nicht weiterverarbeitet
Thema durchsuchen
Ansicht
Themen-Optionen

gerundete Zahlen werden nicht weiterverarbeitet

Ein Thema von vitapower · begonnen am 10. Okt 2012 · letzter Beitrag vom 11. Okt 2012
Antwort Antwort
vitapower

Registriert seit: 8. Okt 2012
3 Beiträge
 
#1

gerundete Zahlen werden nicht weiterverarbeitet

  Alt 10. Okt 2012, 23:44
Hallo,

habe folgendes Problem.

es werden zwei Zahlen im Edit eingegeben, die werden halbiert und auf zwei Kommastellen gerundet.
Dann folgt eine IF Anweisung, die nicht so richtig funktioniert.


var x,y:real;
r2:=RoundTo(x / y,-2);
IF R2 =0.49 THEN BEGIN Faktor1:=2.168 END;
IF R2 =0.50 THEN BEGIN Faktor1:=2.1861 END;
IF R2 =0.51 THEN BEGIN Faktor1:=2.2041 END;


Also bei r2=0,5 zeigt mir Label den richtigen Faktor1, bei den anderen nicht.

HAt jemmand eine Idee was falsch sein könnte. Ich vermute, dass abgerundete Zahl im "System" noch komplett besteht und daher erkennt IF die nicht. Aber wie macht man es besser?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: gerundete Zahlen werden nicht weiterverarbeitet

  Alt 10. Okt 2012, 23:49
Delphi-Quellcode:
r2:Integer

r2:=Round(100 * x / y);
IF R2 =49 THEN BEGIN Faktor1:=2.168 END;
IF R2 =50 THEN BEGIN Faktor1:=2.1861 END;
IF R2 =51 THEN BEGIN Faktor1:=2.2041 END;


//oder
Case R2 of
   49:Faktor:=2.168;
   50:Faktor:=2.1861;
// etc.
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (10. Okt 2012 um 23:51 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.064 Beiträge
 
Delphi XE2 Professional
 
#3

AW: gerundete Zahlen werden nicht weiterverarbeitet

  Alt 11. Okt 2012, 00:17
Hallo,

habe folgendes Problem.

es werden zwei Zahlen im Edit eingegeben, die werden halbiert und auf zwei Kommastellen gerundet.
Dann folgt eine IF Anweisung, die nicht so richtig funktioniert.


var x,y:real;
r2:=RoundTo(x / y,-2);
IF R2 =0.49 THEN BEGIN Faktor1:=2.168 END;
IF R2 =0.50 THEN BEGIN Faktor1:=2.1861 END;
IF R2 =0.51 THEN BEGIN Faktor1:=2.2041 END;


Also bei r2=0,5 zeigt mir Label den richtigen Faktor1, bei den anderen nicht.

HAt jemmand eine Idee was falsch sein könnte. Ich vermute, dass abgerundete Zahl im "System" noch komplett besteht und daher erkennt IF die nicht. Aber wie macht man es besser?
Falsch ist deine Vorstellung von der Vergleichbarkeit von Dezimalbrüchen.

Abgesehen von Potenzen von 2 können Dezimalbrüche bei Realzahlen nicht exakt dargestellt werden.

Sei x=49 und y=100 dann wird nach r2:=RoundTo(x / y,-2) r2 zwar einen Wert haben, der nahe bei 0.49 liegt, aber eben nicht exakt.

Der Vergleich wird über die FPU durchgeführt und in der sehen die Zahlen so aus
r2 = 3FFD FAE1 47AE 147A E147
0.49 = 3FFD FAE1 47AE 147A E148
Beachte die letzte Ziffer in beiden Werten.
Abhilfe:
Entweder
if SameValue(0.49,r2) then …

oder
du definierst r2 als integer, rechnest r2:=Round(x*100/y) und testest mit
if r2=49 then …
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: gerundete Zahlen werden nicht weiterverarbeitet

  Alt 11. Okt 2012, 06:50
oder du verwendest für R2 den Typ Currency (letzlich ein verkappter Int64).
  Mit Zitat antworten Zitat
vitapower

Registriert seit: 8. Okt 2012
3 Beiträge
 
#5

AW: gerundete Zahlen werden nicht weiterverarbeitet

  Alt 11. Okt 2012, 07:46
Danke für schnelle und ausführliche Antworten, werde heute nach der Arbeit testen.
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#6

AW: gerundete Zahlen werden nicht weiterverarbeitet

  Alt 11. Okt 2012, 13:19
Man kann die "Gleichheit" von zwei Real-Zahlen auch so testen:

Delphi-Quellcode:
var
   a, b // die zu vergleichenden Werte
   epsilon: Real;

epsilon := 1e-8; // irgendeine Genauigkeit (hier 10^-8)

if abs(a-b) < epsilon then showmessage('a und b sind gleichgroß');
Gruß
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: gerundete Zahlen werden nicht weiterverarbeitet

  Alt 11. Okt 2012, 14:16
Statt dem manuellen Vergleich, kann man auch gleich die passenden Funktionen nutzen, da sieht man dann eher, was gemacht wird.
Delphi-Referenz durchsuchenIsZero Delphi-Referenz durchsuchenSameValue Delphi-Referenz durchsuchenCompareValue Delphi-Referenz durchsuchenSign Delphi-Referenz durchsuchenInRange

zu IsZero:
0 ist zwar einer der wenigen Werte, welche man theoretisch direkt vergleichen könnte, aber wenn die 0 das Ergebnis einer Berechnung ist, dann muß es ja nicht ganz genau 0 sein.
z.B.: 18 - fast genau 18 = nur fast 0
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (11. Okt 2012 um 14:19 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: gerundete Zahlen werden nicht weiterverarbeitet

  Alt 11. Okt 2012, 17:44
Man kann die "Gleichheit" von zwei Real-Zahlen auch so testen:

Delphi-Quellcode:
var
   a, b // die zu vergleichenden Werte
   epsilon: Real;

epsilon := 1e-8; // irgendeine Genauigkeit (hier 10^-8)

if abs(a-b) < epsilon then showmessage('a und b sind gleichgroß');
Gruß
Genau um so etwas nicht per Hand zu programmieren, sind die von himitsu aufgelisteten Funktionen da. Denn diese 'irgendeine Genauigkeit' ist nicht so einfach vorzugeben. Wenn Du im Nanometerbereich arbeitest, dann ist dein epsilon viel zu groß, bei Lichtjahren allerdings viel zu klein (Basiseinheit Meter).

Da ist 'SameValue' mit dem defaultwert 'epsilon=0' schon pfiffiger. Schau Dir mal den Quelltext an.
  Mit Zitat antworten Zitat
vitapower

Registriert seit: 8. Okt 2012
3 Beiträge
 
#9

AW: gerundete Zahlen werden nicht weiterverarbeitet

  Alt 11. Okt 2012, 20:20
Habe mit integer gelöst, war die einfachste Lösung.
Vielen Dank an alle!!!!!
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:10 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