Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "Ungueltige Gleitkommaoperation" bei Round (https://www.delphipraxis.net/95082-ungueltige-gleitkommaoperation-bei-round.html)

MrAtoZ 30. Jun 2007 13:51


"Ungueltige Gleitkommaoperation" bei Round
 
Moin moin,

ich versuche eine große Gleitkommazahl (128^107 / 187) mittels Round zukürzen,

Delphi-Quellcode:
//tmp,i sind vom Typ Extended
tmp:=Round(i / n);
bekomme aber immer die Fehlermeldung:

Zitat:

"Im Projekt ...ist eine Exception der Klasse EInvalidOP aufgetreten. Meldung 'Ungültige Gleitkommaoperation'....blablaaa"
:wall: :wall:

Kann mir einer von euch vllt sagen was ich da machen kann!?

gruss
Mr.AtoZ

fLaSh11 30. Jun 2007 14:30

Re: "Ungueltige Gleitkommaoperation" bei Round
 
Warum rundest du eine Gleitkommazahl und speicherst das Ergebnis des Rundens wieder in eine Variable vom Typen Extended?

kolbaschedder 30. Jun 2007 14:31

Re: "Ungueltige Gleitkommaoperation" bei Round
 
Hallo,

Bei der Berechnung von 128^107 landet man irgendwo im Bereich 2^225. Geteilt durch 187 ändert daran auch nicht viel. round liefert einen int64 zurück. Dessen Gültigkeitsbereich liegt irgendwo bei 2^63. Das Ergebnis deiner Berechnung liegt also weit ausserhalb eines int64.
Leider fällt mir gerade auch keine Funktion ein, welche einen Extended-Typ rundet. Ausserdem würde er sowieso das korrekte Ergebnis nicht speichern können.

MfG

Kolbi

fLaSh11 30. Jun 2007 14:52

Re: "Ungueltige Gleitkommaoperation" bei Round
 
Wenn du das ganze als wissenschaftliche Zahl (z.B. 1,9*10^1990) vorliegen hast, dann müsste das wie folgt gehen: (einfach Basis und Expo getrennt behandeln)

Delphi-Quellcode:
var
  b: extended; //Basis
  e: integer; // Exponent
  n: integer; //Teiler
  x: integer;
  h: string;
begin
  b := 1.9;
  e := 1990;
  n := 187;

  //(b*10^e / n)
  h := IntToStr(n);
  x := Length(h) - 1;
  h := h[1]+','+Copy(h,2,Length(h));

  e := e - x;
  b := b / StrToFloat(h);
end;
Achtung: Das hab ich mir jetzt grad so ausgedacht, theoretisch müsste es aber funktionieren. Die Zahl muss in wissenschaftlicher schreibweise sein.

//Edit: b kannste dann nach belieben runden!

MrAtoZ 30. Jun 2007 18:21

Re: "Ungueltige Gleitkommaoperation" bei Round
 
danke schon mal für die Hilfe aber so wirklich wars das noch nicht.

Zitat:

Warum rundest du eine Gleitkommazahl und speicherst das Ergebnis des Rundens wieder in eine Variable vom Typen Extended?
Warum nach tmp...weil sie da war :-D und es so anschaulicher ist.

Also ich mache das weil es die MOD-Funktion leider nicht mit Gleitkommazahlen geht. Daher bereche ich den REST so:

(i^r) / s -> (53^3) / 187 = 796,13368983957219251336898395722

Nehme nur den Teil vor dem Komma und Multipliziere ihn mit s, Ziehe die Summe dann von 53^3 ab und bekomme so den Rest

-> 53^3 - (796*187) = 148877 -148852 = 25 = 53^3 MOD 187

Was ja alles kein Problem ist solange der Exponent klein ist. Zum Testen rechne ich quasi 128^107 MOD 187 was 82 ergebensoll.


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