Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   "invalid floating point operation" finde den Fehler nicht (https://www.delphipraxis.net/164198-invalid-floating-point-operation-finde-den-fehler-nicht.html)

St0rmhunter 2. Nov 2011 13:43

Delphi-Version: 7

"invalid floating point operation" finde den Fehler nicht
 
Ich habe ein seltsames Problem, wie der Titel schon sagt beim Klicken auf den Button2 kommt immer die Fehlermeldung "Invalid floating point operation".
Meine Variablen:
Delphi-Quellcode:
var
  Form1: TForm1;
  i,j: Integer;
  Bst,b: Extended;

Das hier ist der Quellcode zu Button2:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  memo2.text:='';
  for i:=1 to length(memo1.text) do
  begin
    Bst:=strtofloat(memo1.text[i]+memo1.text[i+1]+memo1.text[i+2]);
    b:=Bst;
    for j:=2 to strtoint(edit3.text) do
    begin
      Bst:=Bst*b;
    end;
    Bst:=Bst - (Trunc(Bst / strtoint(edit2.text)) * strtoint(edit2.text));
    memo2.text:=memo2.text + chr(strtoint(floattostr(Bst)));
  end;
end;
Der Fehler scheint in dieser Zeile zu sein,
Delphi-Quellcode:
Bst:=Bst - (Trunc(Bst / strtoint(edit2.text)) * strtoint(edit2.text));
denn ohne sie läuft das Programm ohne Fehlermeldung.

Jedoch das seltsame ist die Zeile
Delphi-Quellcode:
Bst:=Bst - (Trunc(Bst / strtoint(edit2.text)) * strtoint(edit2.text));
habe ich auch bei Button1 verwendet, jedoch kommt da keine Fehlermeldung :shock::shock:

Quellcode Button1:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  memo2.text:='';
  for i:=1 to length(memo1.text) do
  begin
    Bst:=ord(memo1.text[i]);
    b:=Bst;
    for j:=2 to strtoint(edit1.text) do
    begin
      Bst:=Bst*b;
    end;
    Bst:=Bst - (Trunc(Bst / strtoint(edit2.text)) * strtoint(edit2.text));
    if Bst <100 then
    begin
      if Bst < 10 then
      begin
        memo2.text:=memo2.text + '00' + floattostr(Bst);
      end
      else
      begin
        memo2.text:=memo2.text + '0' + floattostr(Bst);
      end;
    end
    else
    begin
    memo2.text:=memo2.text + floattostr(Bst);
    end;
  end;
end;
Ich hoffe ihr könnt mir weiterhelfen. Deshalb schonmal danke im voraus :)

Euer St0rmhunter 8-)

DeddyH 2. Nov 2011 13:49

AW: "invalid floating point operation" finde den Fehler nicht
 
Bist Du einmal durchgesteppt und hast Dir die aktuellen Variableninhalte einmal angesehen? Mal abgesehen davon, dass Du munter hinter dem Stringende weiterliest und Logik und Darstellung vermischst, solltest Du vielleicht ein paar Zwischenvariablen und eine minimale Fehlerbehandlung einbauen, das erleichtert die Fehlersuche enorm.

St0rmhunter 2. Nov 2011 21:58

AW: "invalid floating point operation" finde den Fehler nicht
 
Wie ich les hinterm Stringende weiter??

himitsu 2. Nov 2011 22:01

AW: "invalid floating point operation" finde den Fehler nicht
 
Zitat:

Zitat von St0rmhunter (Beitrag 1134145)
Wie ich les hinterm Stringende weiter??


Zitat:

Zitat von St0rmhunter (Beitrag 1134145)
Delphi-Quellcode:
to length(memo1.text) do
  begin
    Bst:=strtofloat(memo1.text[i]+memo1.text[i+1]+memo1.text[i+2]);

(Length+2 > index des letzten Zeichens) = hinter dem Stringende lesen
Geh mal in deine Projektotionen und schalte die Indexprüfung an. :zwinker:

Und .Text holt jedesmal, bei jedem Aufruf den Text neu aus dem Memo ... das vorher in eine Variable erspart Vieles.

Zitat:

Delphi-Quellcode:
memo1.text[i]+memo1.text[i+1]+memo1.text[i+2]

PS: Kennst du schon Delphi-Referenz durchsuchenCopy?

St0rmhunter 3. Nov 2011 16:50

AW: "invalid floating point operation" finde den Fehler nicht
 
Upps da hab ich wohl die -2 vergessen
Delphi-Quellcode:
for i:=1 to length(memo1.text)-2 do
.

Nee kenne copy nicht. :?

So habe die -2 ergänzt und trotzdem kommt noch die Fehlermeldung "Invalid floating point operation" :?

DeddyH 3. Nov 2011 16:58

AW: "invalid floating point operation" finde den Fehler nicht
 
Dann zitiere ich mich mal selbst:
Zitat:

Zitat von DeddyH (Beitrag 1134014)
Bist Du einmal durchgesteppt und hast Dir die aktuellen Variableninhalte einmal angesehen?

Zitat:

Zitat von DeddyH (Beitrag 1134014)
..., solltest Du vielleicht ein paar Zwischenvariablen und eine minimale Fehlerbehandlung einbauen, das erleichtert die Fehlersuche enorm.


Bummi 3. Nov 2011 17:05

AW: "invalid floating point operation" finde den Fehler nicht
 
es gibt 3 Stellen wo der beschriebene Fehler auftreten kann

Bst:=Bst*b; // Überlauf gegf. Double statt Extended

/ strtoint(edit2.text) // Division durch 0

Trunc( // wenn die Zahl zu groß ist

St0rmhunter 4. Nov 2011 15:16

AW: "invalid floating point operation" finde den Fehler nicht
 
@DeddyH

Zitat:

Bist Du einmal durchgesteppt und hast Dir die aktuellen Variableninhalte einmal angesehen?
Mit durchsteppen hast du bestimmt das mit F7 gemeint, also den nächsten Befehl immer erst nach F7 ausführen oder? :? Wenn ja ... das klappt bei mir irgendwie nicht :?

Zitat:

solltest Du vielleicht ein paar Zwischenvariablen und eine minimale Fehlerbehandlung einbauen, das erleichtert die Fehlersuche enorm.
Dann wo denkst du denn sind Zwischenvariablen angebracht? :? Wüsste nicht wo es hilfreich wäre oder nützlich wäre.
Und zu der Idee mit der minimalen Fehlerbehandlung, sry aber ich weiß nicht was du damit meinst?


@Bummi

Zitat:

Bst:=Bst*b; // Überlauf gegf. Double statt Extended
Double ist kleiner als Extended :wink:

Double: 2.23 x 10^-308 bis 1.79 x 10^308 (http://www.delphibasics.co.uk/RTL.asp?Name=Double)
Extended: 3.37 x 10^-4932 to 1.18 x 10^4932 (http://www.delphibasics.co.uk/RTL.asp?Name=Extended)

Zitat:

strtoint(edit2.text) // Division durch 0
Auch ist die Division durch 0 nicht "möglich" weil in edit2 nur positive Zahlen geschrieben werden sollen. Klar wenn der Nutzer 0 reinschreibt isses ne Division durch 0, aber normalerweise stehen da nur positive Zahlen im Feld.

Zitat:

Trunc( // wenn die Zahl zu groß ist
Wie groß darf denn die Zahl bei Trunc( maximal sein?

DeddyH 4. Nov 2011 15:32

AW: "invalid floating point operation" finde den Fehler nicht
 
Welcher Code ist wohl lesbarer und besser zu debuggen?
Beispiel 1:
Delphi-Quellcode:
//Keine Trennung von Logik und Darstellung
Edit3.Text := IntToStr(StrToInt(Edit1.Text) div StrToInt(Edit2.Text));
Beispiel 2:
Delphi-Quellcode:
var
  Dividend, Divisor, Ergebnis: integer;
begin
  if not TryStrToInt(Edit1.Text, Dividend) then
    begin
      ShowMessage('Edit1 enthält keine gültige Zahl');
      exit;
    end;
  if not TryStrToInt(Edit2.Text, Divisor) then
    begin
      ShowMessage('Edit2 enthält keine gültige Zahl');
      exit;
    end;
  if Divisor = 0 then
    begin
      ShowMessage('Divisor darf nicht 0 sein');
      exit;
    end;
  Ergebnis := Dividend div Divisor;
  Edit3.Text := IntToStr(Ergebnis);
Und wenn der Debugger nicht will (Projektoptionen auf Release gestellt?), dann kann man sich zur Not immer noch mit Zwischenausgaben (ShowMessage z.B.) behelfen.

p80286 4. Nov 2011 15:42

AW: "invalid floating point operation" finde den Fehler nicht
 
Zitat:

Zitat von St0rmhunter (Beitrag 1134490)
@DeddyH

Zitat:

Bist Du einmal durchgesteppt und hast Dir die aktuellen Variableninhalte einmal angesehen?
Mit durchsteppen hast du bestimmt das mit F7 gemeint, also den nächsten Befehl immer erst nach F7 ausführen oder? :? Wenn ja ... das klappt bei mir irgendwie nicht :?

irgendwie?
was klappt denn da nicht? gibt es eine Fehlermeldung?
vllt hilft es unter den Projektoptionen / Compiler dem Debugger auf die Sprünge zu helfen?

Zitat:

Zitat von St0rmhunter (Beitrag 1134490)
Dann wo denkst du denn sind Zwischenvariablen angebracht? :? Wüsste nicht wo es hilfreich wäre oder nützlich wäre.
Und zu der Idee mit der minimalen Fehlerbehandlung, sry aber ich weiß nicht was du damit meinst?

Hier z.B.
Delphi-Quellcode:
for j:=2 to strtoint(edit3.text) do
Delphi-Quellcode:
maxj:=strtoint(edit3.text);
if maxj<2 then showmessage('vertan');
for j:=2 to maxj do



Zitat:

strtoint(edit2.text) // Division durch 0
Auch ist die Division durch 0 nicht "möglich" weil in edit2 nur positive Zahlen geschrieben werden sollen. Klar wenn der Nutzer 0 reinschreibt isses ne Division durch 0, aber normalerweise stehen da nur positive Zahlen im Feld.
[/QUOTE]

"normalerweise" ist nicht das gleiche wie NIE!

Normalerweise scheint im Sommer die Sonne und es ist warm (die Frage ist nur wo, und warm ist ziemlich relativ )

Gruß
K-H

Bummi 4. Nov 2011 15:49

AW: "invalid floating point operation" finde den Fehler nicht
 
sorry für meinen Extendedlapsus
die Grenze für Trunc liegt bei 9223372036854775807 = 2^63 - 1 , ab genau welcher Version auch für Int64 implementiert wurde weiß ich allerdings nicht

Bjoerk 4. Nov 2011 16:33

AW: "invalid floating point operation" finde den Fehler nicht
 
So ist es.

Das wird nicht compiliert:

Delphi-Quellcode:
  ShowMessage (FloatToStr(Trunc(High(Int64)+1)));
  ShowMessage (FloatToStr(Int(High(Int64)+1)));

St0rmhunter 4. Nov 2011 19:25

AW: "invalid floating point operation" finde den Fehler nicht
 
Ok danke für die Tipps mit den Showmessages =)

Das mit F7 funktioniert einfach nicht, ich kann f7 drücke oder übers menu gehen und es passiert einfach nichts, das meinte ich mit funktioniert irgendwie nicht ^^

So der Fehler wird dann bei Trunc( liegen, da meine zahlen meistens viel größer sind wie z.B. 142^23 oder ähnlich groß.
Hätte jemand eine Idee wie ich denn bei so großen Zahlen den Rest berechnen kann? Der Windows Rechner kanns ja :)

Für Trunc( sind die Zahlen zu groß mod ist nicht für Extended ...
Hätte keine Idee mehr, einer von euch? :)

Aber soweit schonmal danke für eure Hilfe :-D

Bummi 4. Nov 2011 20:01

AW: "invalid floating point operation" finde den Fehler nicht
 
Um mit F7 steppen zu können muß Du im Code vorher Breakpoints setzen, F5 oder Mausklick links neben dem Quelltext, wenn Du XE verwendest nicht über den grünen Pfeil, sondern über den grünen Pfeil mit Käfer starten.

Theoretisch gäbe es die Funktion Frac aus der Unit Math, die taugt aber für derart große Zahlen auch nicht mehr.

Gegf. arbeitest Du Dich da mal ein:

http://www.delphi-forum.de/viewtopic...hlight=bignum2

gammatester 4. Nov 2011 21:09

AW: "invalid floating point operation" finde den Fehler nicht
 
Ohne Angaben, was Du eigentlich berechnen willst, kann man nur spekulieren. Einiges scheint doch ohne nähere Angaben verbesserungwürdig.

Wenn Du Fließkomma rechnest, wozu der Zwischenschritt über integer, d.h. warum nimmst Du trunc und nicht floor aus der Math-Unit?

Wenn Du als eigentliches Ziel allerdings wirklich zB 142^23 mod 997 berechnen willst, ist Dein Ansatz ziemlich daneben. Nehmen wir an, Du willst b^a mod m berechnen, mit Integerwerten a,b,m. Wenn Du schon a^b in einer Schleife durch Ausmultiplizieren potenzieren und nicht mit schneller Exponentation berechnen willst, reduzierst Du in jedem Schritt mod also
Delphi-Quellcode:
r := b;
for i:=2 to a do begin
  r := r*b mod m;
end;

Wenn Du allerdings nicht Integer sondern Fließkomma rechnen willst, ist eine Lösung
Delphi-Quellcode:
r := power(b,a);
r := r - floor(r/m);

Bjoerk 4. Nov 2011 23:51

AW: "invalid floating point operation" finde den Fehler nicht
 
Zitat:

Zitat von St0rmhunter (Beitrag 1134516)
Ok danke für die Tipps mit den Showmessages =)

Das mit F7 funktioniert einfach nicht, ich kann f7 drücke oder übers menu gehen und es passiert einfach nichts, das meinte ich mit funktioniert irgendwie nicht ^^

So der Fehler wird dann bei Trunc( liegen, da meine zahlen meistens viel größer sind wie z.B. 142^23 oder ähnlich groß.
Hätte jemand eine Idee wie ich denn bei so großen Zahlen den Rest berechnen kann? Der Windows Rechner kanns ja :)

Für Trunc( sind die Zahlen zu groß mod ist nicht für Extended ...
Hätte keine Idee mehr, einer von euch? :)

Aber soweit schonmal danke für eure Hilfe :-D

Sieht nach RSA-Verschlüsselung aus. Probier mal so:

Delphi-Quellcode:
implementation

{$Q+}

function PowerAndMod(A, E, M: int64): int64;
begin
  if (A > MaxInt) or (E > MaxInt) then
    raise Exception.Create('int64 Overflow');
  Result:= 1;
  try
    while E > 0 do
      if E mod 2 <> 0 then
      begin
        Result:= (Result*A) mod M;
        E:= E-1;
      end
      else
      begin
        A:= (A*A) mod M;
        E:= E div 2;
      end;
  except
    raise Exception.Create('int64 Overflow');
  end;
end;

St0rmhunter 14. Nov 2011 17:04

AW: "invalid floating point operation" finde den Fehler nicht
 
So vielen Dank an alle Helfer, war noch Unterwegs in letzter Zeit und hatte keine Zeit für die Programmierung des Programms.

Die Lösung von Gammatester war genau das was ich brauchte jetzt funktioniert endlich auch alles =)
Delphi-Quellcode:
r := b;
for i:=2 to a do begin
  r := r*b mod m;
end;
Nochmal ein großes Danke an alle Helfer, dieses tollen Forums 8-)


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