Autor Beitrag
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mo 05.03.07 17:21 
Hallo,

Ich bräuchte eine Funktion, die mir angibt, ob ein Real- bzw. Extended-Ausdruck eine ganze Zahl ist. Leider hab ich keine Funktion gefunden bei Delphi. Kann man sowas vllt mit
if Frac(x{real}) = 0.0000000000000 then Result := True; realisieren?

Oder gibt es da doch schon was fertiges?

Danke schon mal!


Zuletzt bearbeitet von Jakob Schöttl am Mo 05.03.07 17:34, insgesamt 1-mal bearbeitet
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: Mo 05.03.07 17:28 
Naja, du könntest z.B. folgenden Umweg gehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
{ var
  str: string;
  int: integer;
  x: extended; }


str := floattostr(x);
try
  int := strtoint(str);
  result := true;
except
  result := false;
end;

oder so ähnlich.

Gruß

Calculon
--
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 05.03.07 17:29 
Wie wäre es mit FRAC

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mo 05.03.07 17:34 
user profile iconJakob Schöttl hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
if Trunc(x{real}) = 0.0000000000000 then Result := True;					

hier meinte ich natürlich Frac ;)

Nun ja, so wie user profile iconCalculon es gemacht hat, so mache ich es dann wahrscheinlich auch. Auch wenn es nicht so schön ist, aber ich glaub fast, was besseres gibt es nicht...
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: Mo 05.03.07 17:57 
Hi nochmal,

hab' grad was ausprobiert und scheint auch zu klappen. Vielleicht gefällt dir das ja besser:

ausblenden Delphi-Quelltext
1:
2:
if round(strtofloat(edit1.text)) <> strtofloat(edit1.Text) then showmessage('FLOATING VALUE')
else ShowMessage('INTEGER VALUE');

Gruß

Calculon
--
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Mo 05.03.07 17:58 
:?: Öööhm ... ich kann euch inhaltlich - glaube ich - nicht ganz folgen.

Aber folgendes funktioniert doch:

ausblenden Delphi-Quelltext
1:
2:
if Frac(x) = 0 then 
   IchBinGanz := true;


//Nachtrag:
Es funktioniert mit der diesen Funktionen zugrunde liegenden Ungenauigkeiten. :(
5,0000000000000001 würde er als Ganzzahl erkennen.

//Nachtrag 2:
Und eigentlich wollte ich mich ja gar nicht selbst quoten, sondern mein Vorposting nur editieren. :cry:
Ich muss langsam Feierabend machen .....

Moderiert von user profile iconjasocul: Beiträge zusammengefasst
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mo 05.03.07 18:31 
user profile iconIngoD7 hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
if Frac(x) = 0 then 
   IchBinGanz := true;

... mit Ungenauigkeiten ...


Aber ich glaube ich nehme dann doch diese Funktion, weil solche Ungenauigkeiten treten wahrscheinlich bei FloatToStr auch auf.

Dann siehts also so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function IstGanzeZahl(x: extended): Boolean;
begin
  if Frac(x) = 0 then result := True else Result := False; { Das ist übrigens hundertmal schenller als mit dem try ... except und FloatToStr... }
end;


Gut, Danke mal wieder an alle!
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 05.03.07 19:47 
So wäre es kürzer
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function IstGanzeZahl(x: extended): Boolean;
begin
  Result := Frac(x) = 0;
end;

und so wäre es genauer
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function IstGanzeZahl(x: extended): Boolean;
const 
  Epsilon = 1E-10// anpassen
begin
  Result := ABS(Frac(x)(<Epsilon;
end;

//EDIT: ABS hinzugefügt

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!


Zuletzt bearbeitet von Kroko am Mi 07.03.07 08:35, insgesamt 2-mal bearbeitet
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mo 05.03.07 20:02 
Ich muss jetzt weg kann die genauen Befehle also gerade nicht raussuchen.

Aber In FPU runden FPRDINT irgendwieso und dann vergleichen und Flags setzen oder halt eax als resultat einer Funktion
FCOMIP dürte da sehr hilfreich sein.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 07.03.07 03:30 
@Kroko: Fast richtig ...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function IstGanzeZahl(x: extended): Boolean;
const 
  Epsilon = 1E-10// anpassen
begin
  Result := Abs(Frac(x))<Epsilon;
end;


Ansonsten meint er -5.25 ist eine Ganzzahl :P

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 07.03.07 06:30 
//EDIT: Abs gehört mit rein, reisen Denkfehler :oops:

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!