AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Harmonische Reihe - "Ungültige Gleitkommaoperation"??
Thema durchsuchen
Ansicht
Themen-Optionen

Harmonische Reihe - "Ungültige Gleitkommaoperation"??

Ein Thema von jraxxo · begonnen am 28. Mär 2010 · letzter Beitrag vom 28. Mär 2010
Antwort Antwort
jraxxo

Registriert seit: 7. Dez 2009
Ort: Groß Glienicke
9 Beiträge
 
#1

Harmonische Reihe - "Ungültige Gleitkommaoperation"

  Alt 28. Mär 2010, 15:41
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
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&

  Alt 28. Mär 2010, 15:44
Debugge das doch mal, wo genau kommt diese Fehlermeldung?
Ich vermute mal da: 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;
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
jraxxo

Registriert seit: 7. Dez 2009
Ort: Groß Glienicke
9 Beiträge
 
#3

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&

  Alt 28. Mär 2010, 15:45
Hab die Lösung. Ich bin doof.
Ich hab schlichtweg vergessen, X am Anfang gleich 1 zu setzen. *facepalm*

trotzdem danke.

so long

Joscha
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&

  Alt 28. Mär 2010, 16:05
"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.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
jraxxo

Registriert seit: 7. Dez 2009
Ort: Groß Glienicke
9 Beiträge
 
#5

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&

  Alt 28. Mär 2010, 16:44
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Harmonische Reihe - "Ungültige Gleitkommaoperation&

  Alt 28. Mär 2010, 17:04
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 23:49 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