Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Harmonische Reihe - "Ungültige Gleitkommaoperation"?? (https://www.delphipraxis.net/149720-harmonische-reihe-ungueltige-gleitkommaoperation.html)

jraxxo 28. Mär 2010 14:41


Harmonische Reihe - "Ungültige Gleitkommaoperation"
 
Hallo zusammen,
ich habe ein Problem, und zwar programmiere ich gerade für einen Bekannten ein paar Sachen zusammen (wegen Iteration -> Harmonische Reihe, Bierschaumzerfall ...all solche simplen Dinge.)
Eigentlich könnte ich das auch alles... aber Delphi (ich benutze TurboDelphi 2006) ist ein bisschen bockig. Es geht um folgenden Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var X,eingabe :extended;
    I :integer;
    fertig:boolean;
begin
 eingabe:=StrtoFloat(Edit1.Text);
 for I := 2 to 100000 do begin
  x:=x+(1/i);
  if x>eingabe then fertig:=true; {Überprüfung ob X größer als die Eingegebene Zahl ist}
 end;
 if fertig then begin Edit1.Text:=('Die eingabe wurde überschritten. Summationen:');
                      Edit2.Text:=(IntToStr(i));
 end else Edit1.Text:=('Die Zahl wurde nicht erreicht, da die Berechnung nach 100000 Summationen abgebrochen wurde.');
end;
end.
Eigentlich sehr einfach alles, aber er hört nicht auf mir, sobald ich den besagten Button betätige, eine Fehlermeldung auszugeben -"Ungültige Gleitkommaoperation".
Wahrscheinlich irgendwas ganz blödes was ich einfach übersehe.
Für Antworten bedanke ich mich im Voraus. :)

So Long

Joscha

Teekeks 28. Mär 2010 14:44

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&
 
Debugge das doch mal, wo genau kommt diese Fehlermeldung?
Ich vermute mal da:
Delphi-Quellcode:
if x>eingabe then
Ich vermute das du den extended zuerst runden musst (round).

[EDIT]
wenn ein wert gefunden wurde wird die schleife nicht abgebrochen...
Mach das hier:
Delphi-Quellcode:
if fertig then begin Edit1.Text:=('Die eingabe wurde überschritten. Summationen:');
                      Edit2.Text:=(IntToStr(i));
                      break;
end else Edit1.Text:=('Die Zahl wurde nicht erreicht, da die Berechnung nach 100000 Summationen abgebrochen wurde.');
end;

jraxxo 28. Mär 2010 14:45

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&
 
Hab die Lösung. Ich bin doof. :P
Ich hab schlichtweg vergessen, X am Anfang gleich 1 zu setzen. *facepalm*

trotzdem danke. :D

so long

Joscha

himitsu 28. Mär 2010 15:05

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&
 
"fertig" wurde auch nicht initialisiert (false)
"x" hast du schon bemerkt
"i" ist nach Schleifendurchlauf undefiniert

Wobei diese beiden Initialisierungsfehler "x" und "fertig", sowie das undefinierte "i" eigentlich von Delphi hätten beängelt werden sollten. :gruebel:

Wenn ich dann alles Kürze, dann komm ich auf dieses:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var eingabe: Extended;
  i: Integer;
begin
  eingabe := StrToFloat(Edit1.Text);
  if eingabe < 11.0901461298634 then begin
    Edit1.Text := 'Die eingabe wurde überschritten. Summationen:';
    Edit2.Text := IntToStr(i); // i ist nicht initialisiert
  end else
    Edit1.Text := 'Die Zahl wurde nicht erreicht, da die Berechnung nach '
      + '100000 Summationen abgebrochen wurde.');
end;
Entweder du prüfst in einer While- oder Repeat-Schleife und brichts bei erfolgreichem Vergleich die Schleife ab
oder du merkst dir wenigstens den Wert von i (also innerhalb der For-Schleife)
oder du verlegst die Auswertung auch teilweise in die Schleife.

jraxxo 28. Mär 2010 15:44

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&
 
Ich hab jetzt die Auswertung in die Schleife verlegt, aber jetzt sagt er bei jeder Zahl dass sie nicht erreicht werden konnte :(

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var X,eingabe :extended;
    I :integer;
    fertig:boolean;
begin
 x:=0;
 eingabe:=StrtoFloat(Edit1.Text);
 for I := 1 to 100000 do begin
  x:=x+(1/i);
  if x>eingabe then begin
   break;
   Edit1.Text:=('Die eingabe wurde überschritten. Summationen:');
   Edit2.Text:=(IntToStr(i));
 end else Edit1.Text:=('Die Zahl wurde nicht erreicht, da die Berechnung nach 100000 Summationen abgebrochen wurde.');
  end;
 end;

himitsu 28. Mär 2010 16:04

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&
 
Zitat:

Zitat von himitsu
teilweise

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var x,eingabe :extended;
    I :integer;
begin
  x:=0;
  eingabe:=StrtoFloat(Edit1.Text);
  for I := 1 to 100000 do begin
    x:=x+(1/i);
    if x>eingabe then begin
      Edit1.Text:=('Die eingabe wurde überschritten. Summationen:');
      Edit2.Text:=(IntToStr(i));
      exit;
    end;
  end;
  Edit1.Text:=('Die Zahl wurde nicht erreicht, da die Berechnung nach 100000 Summationen abgebrochen wurde.')
end;
oder eben
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var x,eingabe :extended;
    I :integer;
    fertig :boolean;
begin
  x:=0;
  eingabe:=StrtoFloat(Edit1.Text);
  fertig:=true;
  for I := 1 to 100000 do begin
    x:=x+(1/i);
    if x>eingabe then begin
      Edit1.Text:=('Die eingabe wurde überschritten. Summationen:');
      Edit2.Text:=(IntToStr(i));
      fertig:=false;
      break;
    end;
  end;
  if fertig then Edit1.Text:=('Die Zahl wurde nicht erreicht, da die Berechnung nach 100000 Summationen abgebrochen wurde.')
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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