Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Integer zu Float umwandeln (https://www.delphipraxis.net/130962-integer-zu-float-umwandeln.html)

brushmate 16. Mär 2009 18:36


Integer zu Float umwandeln
 
Hallo,

ich muss gerade für meine facharbeit die RSA-Verschlüsselung programmieren. Ich muss irgend wann die Formel C = K^e mod N berechnen.
Das habe ich folgendermaßen implementiert:

Delphi-Quellcode:
crypt := function TForm1.crypt(K: Integer): Extended;
begin
  crypt := power(K, e) mod N;
end ;
die power-Funktion gibt allerdings den Extended-Datentyp zurück, N ist aber Integer. Bisher habe ich nichts gefunden, wie ich N in Extended umwandeln kann.

jaenicke 16. Mär 2009 18:41

Re: Integer zu Float umwandeln
 
Zitat:

Zitat von brushmate
Delphi-Quellcode:
crypt := function TForm1.crypt(K: Integer): Extended;
begin

Da ist wohl ein "crypt := " zu viel. ;-)

Zitat:

Zitat von brushmate
Delphi-Quellcode:
  crypt := power(K, e) mod N;

mod ist eine Integerdivision, du hast aber als Rückgabewert einen Fließkommawert.

Zitat:

Zitat von brushmate
die power-Funktion gibt allerdings den Extended-Datentyp zurück, N ist aber Integer. Bisher habe ich nichts gefunden, wie ich N in Extended umwandeln kann.

Das nutzt dir ja nichts, denn mod geht ja nur mit zwei Integerwerten.
Wie wäre es denn so:
Delphi-Quellcode:
function TForm1.Crypt(K: Integer): Extended;
begin
  Result := Power(K, e) / N;
end ;
Den Rückgabewert legt man normalerweise in Result, deine Schreibweise ist zwar möglich, aber wenig sinnvoll. (Sonst musst du z.B. bei einer Umbenennung der Funktion auch jede Zuweisung umbenennen und lesbar ist das auch nicht so gut.)

blink182 16. Mär 2009 18:54

Re: Integer zu Float umwandeln
 
Zitat:

Zitat von jaenicke
Delphi-Quellcode:
function TForm1.Crypt(K: Integer): Extended;
begin
  Result := Power(K, e) / N;
end ;

mhm das ist ja nicht gerade der Sinn von Mod^^ und den braucht man ja bei RSA

also was nicht schön ist aber Round oder Trunc (Abrunden) funktionieren,

aber ggf. kannst du dir ja auch eine "mod"-funktion selber schreiben, die mit extended funktioniert

r:=a mod b

Delphi-Quellcode:
while a>=b do
a:=a-b;
r:=a;
bzw

Delphi-Quellcode:
asm
mov ax,a
@anfang_schleife: cmp ax,b
jl @ausgabe
sub ax,b
jmp @anfang_schleife
@ausgabe: mov c,ax
end;
MfG blink182

brushmate 16. Mär 2009 18:56

Re: Integer zu Float umwandeln
 
Hi,

ich wollte zuerst nur den crypt := (K^e)...Teil posten, deshalb war eins zuviel.

Wenn ich K^e / N rechnen würde, würde ich doch etwas anderes erhalten ald mit mod.
Ich hab mal probiert den integer erst in string und den dann in float umzuwandel, funktioniert aber auch nicht...

brushmate 16. Mär 2009 18:59

Re: Integer zu Float umwandeln
 
hab ich das jetzt richtig verstanden, dass der mod-Befehl nicht mit float-datentypen funktioniert oder liets an den unterschiedlichen datentypen extended und integer?

alleinherrscher 16. Mär 2009 19:04

Re: Integer zu Float umwandeln
 
Hm, also wenn du deine Variablen als Real definierst, sollte die Umwandlung von Integer zu Real kein Problem sein, da Real einen größeren Zahlenbereich abdeckt als Integer. Also müsstest du das Ergebnis, was dir dein Modulo liefert einfach einer Real Variablen zuweisen können.

brushmate 16. Mär 2009 19:07

Re: Integer zu Float umwandeln
 
kann ich real denn auch mit extended verrechnen?

blink182 16. Mär 2009 19:10

Re: Integer zu Float umwandeln
 
Zitat:

Zitat von DelphiHilfe
Operator Operation Operandtyp Ergebnistyp Beispiel
mod Rest Integer Integer Y mod 6

Der Operator mod liefert den Rest, der sich bei der Division seiner Operanden ergibt. Das bedeutet: x mod y = x – (x div y) * y.


schreibs halt einfach um, ja und mod funktioniert nur mit integer und power liefert extented



ja kannst du , da es ja beide gleitkommazahlen sind aber extended ist größer als real ;)

extened -> 3.4*10^-4932 bis 1.1*10^4932 und real ist da "bisschen" weniger 2.9*10^-39 bis 1.7*10^38

alleinherrscher 16. Mär 2009 19:12

Re: Integer zu Float umwandeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ups, blink182 hat natürlich recht, extended is viel größer als real! Aber trotzdem: Ich seh das Problem einfach nicht, also einer Real bzw. Extended Variablen kann man doch ohne weiteres ein Intergerwert zuweisen oder? (siehe Anhang)

brushmate 16. Mär 2009 19:15

Re: Integer zu Float umwandeln
 
hab ich auch grad in der hilfe gelesen...
also es gibt jetzt keine möglichkeit integer direkt in extended umzuwandeln und ich muss mir jetzt selber das modulo basteln?
hatte das grad mal versucht aber da muss ja auch wieder ein extended wert und ein integer wert rein und dann krieg ich wieder einen fehler...

Delphi-Quellcode:
function modulo(m: Extended, n: Integer): Integer;
begin
  while m >= n do begin
    m := m - n;
    result := m;
  end;
end;

blink182 16. Mär 2009 19:21

Re: Integer zu Float umwandeln
 
dann setz das result halt auf extended ;)
Delphi-Quellcode:
function modulo(m: Extended; n: Integer): extended;
da m ja bei dir auch extended ist als werte-parameter ;)

aber um das umzuwandeln hilft halt round bzw trunc aber bei so großen zahlen bringt das ja auch nicht so viel, da Int64 ja max 9*10^18 aufnehmen kann und ggf. der rest größer ist als dieser wert, aber schau dir mal http://www.michael-puff.de/Developer...agen_Reddmann/ an, vllt gibts ja da etwas ;)

brushmate 16. Mär 2009 19:23

Re: Integer zu Float umwandeln
 
ja danke hab ich mir mal angeschaut (du meinst dieses dec oder?)... fand ich aber etwas zu kompliziert...^^

brushmate 16. Mär 2009 19:25

Re: Integer zu Float umwandeln
 
habs jetzt so gemacht:

Delphi-Quellcode:
function TForm1.modulo(m, n: Extended): Extended;
begin
  while m >= n do begin
    m := m - n;
    result := m;
  end;
end;

function TForm1.crypt(K: Integer): Extended;
var help: Extended;
begin
  help := N;
  crypt := modulo(power(K, e), N);
end ;
danke für eure hilfe, scheint bis hier zu laufen

brushmate 16. Mär 2009 19:35

Re: Integer zu Float umwandeln
 
ich hab noch eien frage:

was ist hier dran falsch?
Delphi-Quellcode:
    function modulo(m: Extended, n: Integer): Extended;
delphi zeigt mir folgenden fehler an:
[Fehler] Unit1.pas(25): ';', ')' oder '=' erwartet, aber ',' gefunden

mkinzler 16. Mär 2009 19:40

Re: Integer zu Float umwandeln
 
Zwischen Variablen mit verschiedenen Typen wird ein ; erwartet
Delphi-Quellcode:
function modulo(m: Extended; n: Integer): Extended;

Apollonius 16. Mär 2009 19:41

Re: Integer zu Float umwandeln
 
Irgendwie taucht dieses Thema alle paar Monate auf, aber keiner gibt die meiner Meinung nach richtige Antwort: Verwende nie Power, wenn du danach mod verwendest. klick


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