Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Eine ganzzahl herrausfinden? (https://www.delphipraxis.net/114159-eine-ganzzahl-herrausfinden.html)

heru1990 20. Mai 2008 19:42


Eine ganzzahl herrausfinden?
 
Heyho,

ich möchte das eine funktion als ergbnis eine Ganzzahl hat und habe das bisher folgendermaßen umgesetzt:

Delphi-Quellcode:
var
  Form1: TForm1;
   v:extended;
   v2:integer;
   i:real;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  i:=-100;
  v:=1;
  v2:=2;
  while v/v2<>1 do
  begin
  i:=i+0.0001;
    v:=(-8/5)*i+sqrt((39/25)*(i*i)-19);
    v2:=round(v);
   // label1.caption:=floattostr(v2);
   // label2.caption:=floattostr(v);
  end;
    label1.caption:=floattostr(v2);
    label2.caption:=floattostr(v);
   showmessage('YEAH');
end;
Es soll die funktion kalkuliert werden und durch den gerundeten wert geteilt werden. wenn beide werte gleichgroß sind und man diese dividiert kommt 0 raus --> ganze zahl


jedoch bringt er nach dem Klick die Meldung 'EInvalidOp' - 'Ungültige Gleitkommastelle'


was habe ich falsch gemacht?!?


vielen dank für eure hilfe

mkinzler 20. Mai 2008 19:47

Re: Eine ganzzahl herrausfinden?
 
In welcher Zeile kommt der Fehler und bei welchen Werten?

heru1990 20. Mai 2008 19:48

Re: Eine ganzzahl herrausfinden?
 
v:=(-8/5)*i+sqrt((39/25)*(i*i)-19);

direkt wenn ich auf den button klicke

mkinzler 20. Mai 2008 19:50

Re: Eine ganzzahl herrausfinden?
 
Welchen Wert hat i, v, v2 dann?

heru1990 20. Mai 2008 19:59

Re: Eine ganzzahl herrausfinden?
 
interessant...
Delphi-Quellcode:
  begin
  i:=i+0.0001;
    v:=(-8/5)*i+sqrt((39/25)*(i*i)-19);
    v2:=round(v);
    showmessage('v2 : '+floattostr(v2));
    showmessage('v : '+floattostr(v));
    //label1.caption:=floattostr(v2);
    //label2.caption:=floattostr(v);
  end;
wenn ich ne showmessage reinmache läuft er ohne problme und gibt werte immer aus

nach dem klick:
v = 248,8235...
v2 = 285
i = -99,999

mkinzler 20. Mai 2008 20:01

Re: Eine ganzzahl herrausfinden?
 
Delphi-Quellcode:
label1.caption:=IntToStr(v2);

heru1990 20. Mai 2008 20:03

Re: Eine ganzzahl herrausfinden?
 
hab mehere varianten ausprobiert... er gibt die werte nur mit einem showmessage aus

marabu 20. Mai 2008 20:09

Re: Eine ganzzahl herrausfinden?
 
Herzlich willkommen in der Delphi-PRAXiS, heru1990.

Du suchst iterativ in Schritten von 1E-4 nach einer ganzzahligen Lösung einer Funktion. Dein Abbruchkriterium ist aber unzuverlässig, da dein Rechner ganzzahlige Ergebnisse oft nach Art der ersten Taschenrechner nur näherungsweise als Fließkommazahl wiedergeben kann. Notwendig ist da ein Epsilon-Test:

Delphi-Quellcode:
const
  EPSILON = 1E-8;

function F(x: Double): Double;
begin
  Result := (-8/5) * x + Sqrt(39 / 25 * x * x - 19);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  x, y: Double;
begin
  x := -100;
  repeat
    x := x + 0.0001;
    y := F(x);
  until IsZero(y - Round(y), EPSILON);
  ShowMessage(Format('%0.4f  %.0n', [x, y]));
end;
Getippt und nicht getestet.

Freundliche Grüße vom marabu

heru1990 20. Mai 2008 20:17

Re: Eine ganzzahl herrausfinden?
 
Wow vielen dank =)

jedoch kommt die gleiche meldung mit der kommastelle in folgender zeile:

Delphi-Quellcode:
  Result := (-8/5) * x + Sqrt(39 / 25 * x * x - 19);
:?

marabu 20. Mai 2008 20:49

Re: Eine ganzzahl herrausfinden?
 
Deine Funktion ist nicht für alle x aus R definiert.

Sobald der Ausdruck 39 / 25 * x * x - 19 negativ wird, siehst du die Ausnahme "Ungültige Gleitkommaoperation".

Du solltest das zu durchsuchende Intervall geeignet begrenzen.

heru1990 20. Mai 2008 20:56

Re: Eine ganzzahl herrausfinden?
 
Delphi-Quellcode:
const
  EPSILON = 1E-8;

function F(x: Double): Double;
begin
  Result := (-8/5) * x + Sqrt(39 / 25 * x * x - 19);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x, y: Double;
begin
  x := -100;

    while (39 / 25 * x * x - 19) < 0 do
    begin
    x := x + 0.0001;
    end;
   
  repeat
    x := x + 0.0001;
    y := F(x);
  until IsZero(y - Round(y), EPSILON);
  ShowMessage(Format('%0.4f  %.0n', [x, y]));
end;
naja ich hab jetzt ein while rein mit der das eigentlich umgangen werden müsste, jedoch besteht das problem weiterhin

marabu 20. Mai 2008 21:17

Re: Eine ganzzahl herrausfinden?
 
Besser so:

Delphi-Quellcode:
const
  INFIMUM = -100;
  MAXIMUM = 1000;
  EPSILON = 1E-8;
  STEP = 1E-4;

function F(x: Double): Double;
var
  r: Double;
begin
  r := 39 / 25 * x * x - 19;
  if r < 0
    then Result := NaN
    else Result := (-8/5) * x + Sqrt(r);
end;

procedure TDemoForm.Button14Click(Sender: TObject);
var
  x, y: Double;
begin
  x := INFIMUM;
  repeat
    x := x + STEP;
    y := F(x);
  until IsNaN(y) or (x > MAXIMUM) or IsZero(y - Round(y), EPSILON);
  if IsNaN(y)
    then ShowMessage('rats')
    else ShowMessage(Format('x = %0.4f  y = %.4f', [x, y]));
end;
Analysiere die Unterschiede.

heru1990 20. Mai 2008 21:29

Re: Eine ganzzahl herrausfinden?
 
da hätte ich jetzt mal eine frage:

wenn ich klicke kommt sofort 'rats'

wenn ich jedoch schritt für schritt (F7) das Programm durchgehe geht er nicht bis dahin?!?

marabu 20. Mai 2008 21:39

Re: Eine ganzzahl herrausfinden?
 
Und was schließt du daraus?

"Herr Doktor, wenn ich mit meinem Finger hier drücke, dann tut es unwahrscheinlich weh. Auch hier und hier und hier, was stimmt da nicht?"
"Ihr Finger ist gebrochen!"

Ohne Haltepunkt verlässt dein Programm wahrscheinlich sehr schnell den Gültigkeitsbereich.
Bei schrittweisem Abarbeiten benötigst du vielleicht eine Million Durchläufe.

Gute Nacht.

heru1990 20. Mai 2008 22:05

Re: Eine ganzzahl herrausfinden?
 
okay sry die frage hätte ich mir wirklich sparen können ;) aber vielen dank


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz