Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler: Ungültige Gleitkommaoperation (https://www.delphipraxis.net/128112-fehler-ungueltige-gleitkommaoperation.html)

linopolus 24. Jan 2009 12:02


Fehler: Ungültige Gleitkommaoperation
 
Ich programmiere gerade ein Programm für die RSA-Verschlüsselung und habe dabei folgendes Problemchen: Ich bekomme ständig den Laufzeitfehler "Ungültige Gleitkommaoperation". Der betreffende Code sieht so aus:
Delphi-Quellcode:
buchstabe:=Round(IntPower(buchstabe,d)) mod n;
sprich buchstabe^d modulo n
Die Variable Buchstabe ist int64. Wenn nun zB buchstabe=9,d=59 und n=35 kommt mein Fehler.

Rausgefunden habe ich bereits, dass das Ergebnis von IntPower zu hoch ist. Wenn ich als d zB 11 nehme geht es.

Meine Frage ist also: Wie kann ich das umgehen?

Meflin 24. Jan 2009 12:04

Re: Fehler: Ungültige Gleitkommaoperation
 
Zitat:

Zitat von linopolus
Rausgefunden habe ich bereits, dass das Ergebnis von IntPower zu hoch ist. Wenn ich als d zB 11 nehme geht es.

Welche Datentypen benutzt du? 9 hoch 59 ist weit jenseits dessen, was du z. b. in einem Integer Speichern kannst.

-> Hier im Forum suchenBigInt

Apollonius 24. Jan 2009 12:05

Re: Fehler: Ungültige Gleitkommaoperation
 
Wenn du auf diese Art Potenzen berechnest, wirst du selbst mit größeren Integer-Klassen nicht weit kommen.

linopolus 24. Jan 2009 12:11

Re: Fehler: Ungültige Gleitkommaoperation
 
Zitat:

Zitat von Apollonius
Wenn du auf diese Art Potenzen berechnest, wirst du selbst mit größeren Integer-Klassen nicht weit kommen.

Das habe ich auch schon gemerkt deshalb frage ich ja:)
Zitat:

Zitat von Meflin
Welche Datentypen benutzt du?

Int64 hab ich doch geschrieben

Meflin 24. Jan 2009 12:17

Re: Fehler: Ungültige Gleitkommaoperation
 
Zitat:

Zitat von linopolus
Int64 hab ich doch geschrieben

Achso :stupid: Wie gesagt, du wirst eine BigInt-Klasse verwenden müssen, wie beipsielsweise die hier:
http://www.delphipraxis.net/internal...ct.php?t=88532

Wenn sowas immernoch nicht reicht, hast du schlechte Karten das ohne spezielle (größerregisterige Hardware) hinzubekommen.

Apollonius 24. Jan 2009 12:23

Re: Fehler: Ungültige Gleitkommaoperation
 
Um mal deutlicher zu werden: Wenn du erst potenzierst und dann den Rest nimmst, kann dir keine BigInt-Klasse der Welt mehr helfen. Du musst alle Zahlen der Form buchstabe^(2^k) bis 2^k >= d durch fortgesetztes Quadrieren berechnen und dabei nach jedem Quadrieren ein Modulo einbauen. So kannst du die Größe der Zahlen auf n^2 begrenzen. Mit den Potenzgesetzen kannst du die einzelnen Zahlen dann zu buchstabe^d kombinieren.

linopolus 24. Jan 2009 12:26

Re: Fehler: Ungültige Gleitkommaoperation
 
Zitat:

Zitat von Apollonius
Um mal deutlicher zu werden: Wenn du erst potenzierst und dann den Rest nimmst, kann dir keine BigInt-Klasse der Welt mehr helfen. Du musst alle Zahlen der Form buchstabe^(2^k) bis 2^k >= d durch fortgesetztes Quadrieren berechnen und dabei nach jedem Quadrieren ein Modulo einbauen. So kannst du die Größe der Zahlen auf n^2 begrenzen. Mit den Potenzgesetzen kannst du die einzelnen Zahlen dann zu buchstabe^d kombinieren.

:?:

Sorry bin erst 13 da hat man in Mathe noch nicht alles durchgekaut.
Bissl anschaulicher wäre schön:)(am besten mit nem konkreten Beispiel)


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