Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wurzel aus Int64 ziehen (https://www.delphipraxis.net/25963-wurzel-aus-int64-ziehen.html)

Filou 15. Jul 2004 16:27


Wurzel aus Int64 ziehen
 
Hallo,

zur Berechnung von größeren Zahlen muss ich aus einer Zahl vom Datentyp Int64 die Wurzel ziehen. Ich hab es mit folgenden Code versucht, der bei LongInt funktioniert:
Delphi-Quellcode:
//wurzel, zahl:LongInt;
wurzel := trunc(sqrt(zahl));
Doch bei Int64 klappt das nicht. Wie kann ich trotzdem die Wurzel aus einem Int64 ziehen?

Tschau und vielen Dank im vorraus,
Filou

The-X 15. Jul 2004 16:45

Re: Wurzel aus Int64 ziehen
 
ich hab zu Hause eine Funktion um Exponenten zu jeder Basis mit einem Einzeiler zu berechnen ... damit kann man auch die 2. -n. Wurzel aus einer Zahl ziehen.
Ob das allerdings auch mit Int64 funktioniert weiss ich nicht, ich werde die Code-Zeile aber hier Posten, wenn ich zu Hause bin (also heute abend) ;)

micsie 15. Jul 2004 16:48

Re: Wurzel aus Int64 ziehen
 
Hallo,

ich kenne zwar nicht die direkte Möglichkeit in Delphi, du könntest aber evtl. auch eine eigene Funktion programmieren (siehe Babylonisches Verfahren - http://mo.mathematik.uni-stuttgart.d...3/index_s.html)

mfg micsie

Luckie 15. Jul 2004 16:49

Re: Wurzel aus Int64 ziehen
 
So geht es:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  wurzel: LongInt;
  Radiant: Extended;
begin
  Radiant := 144;
  wurzel := Trunc(sqrt(Radiant));
  ShowMessage(IntToStr(wurzel));
end;
Warum sqrt auch einen LongInt akzeptiert, wo es doch einen Extended erwartet, kann ich dir auch nicht sagen.

The-X 15. Jul 2004 17:00

Re: Wurzel aus Int64 ziehen
 
warscheinlich weil er intern vom Compiler in einen reellen Datentyp umgewandelt wird ;)

[edit] zumindest für diese Funktion [/edit]

dizzy 15. Jul 2004 17:03

Re: Wurzel aus Int64 ziehen
 
Ne Luckie, er will ja die Wurzel aus nem Int64 ziehen, nicht nem LongInt. LongInt ist 4 Bit breit, und Int64 8 Bit, somit passt ein LongInt noch in Extended rein, aber ein Int64 nicht mehr ohne Genauigkeitsverlust. LongInt -> Extended geht implizit, von daher meckert Delphi auch net. Aber bei Int64 ist alles anders...

The-X 15. Jul 2004 17:41

Re: Wurzel aus Int64 ziehen
 
ich hoffe doch du meinst Byte und nicht bit :mrgreen: weil sonst wäre Int64 = Byte

dizzy 15. Jul 2004 19:38

Re: Wurzel aus Int64 ziehen
 
:oops:

Filou 15. Jul 2004 19:39

Re: Wurzel aus Int64 ziehen
 
Ich hab zwei Möglichkeiten gefunden. Möglichkeit 1 besteht darin, dass Int64-Variable in einen String und dann in den Datentyp Extended umgewandelt wird. Um anschließend die Wurzel zuziehen können.
Delphi-Quellcode:
var
  code:integer;
  zahl, wurzel:int64;
  stri:string;
  ext:extended;

  stri := IntToStr(zahl);
  Val(stri,ext,code);
  wurzel := trunc(sqrt(ext));
Die zweite Möglichkeit baut auf dem Babylonischen Algorythmus auf.
Delphi-Quellcode:
var
  zahl, wurzel:int64;
  i:integer;
  ext:extended;

ext := 1;
for i:=1 to 25 do
  ext := (ext + (zahl/ext))/2;

wurzel := trunc(ext);
Tschau!

Filou 15. Jul 2004 20:07

Re: Wurzel aus Int64 ziehen
 
Anmerkung: Beide Funktionen sind gleich schnell.
Falls man Int64 nicht ganz ausreizen möchte oder einem zu große Ergebnisse genügen, kann man im zweiten Beispiel einen kleineren Wert statt "25" verwenden.


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