Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi wirklich große Zahlen unter Delphi (https://www.delphipraxis.net/75188-wirklich-grosse-zahlen-unter-delphi.html)

negaH 15. Aug 2006 22:43

Re: wirklich große Zahlen unter Delphi
 
Zitat:

Ich spiele mit dem Gedanken, eine Unit für komplexe Zahlen zu schreiben und dafür ebenfalls Interfaces zu verwenden...
Wie siehts aus bezüglich Overhead? Also wenn man ganze Matrizen voll mit solchen Interfaced Numbers verwendet...


Gute Frage, die ich mir damals auch gestellt habe ;) Und jetzt weis ich die Antwort ganz genau.

Also im normalen Tagesgeschäft, rechnen mit sehr großen Zahlen, ist der Overhead minimal. Es ist sogar so, das ich NUR über die Interfaces auf einfachste Weise einen Speichermanager reinbauen konnte. Dieser ist optimiert auf die Bibliothek und bingt nun ca. 10% größerer Performance. Das heist die Interfaces beschleunigen sogar, weil mit ihnen mehr Features möglich sind ;)

Wenn man aber 32-64Bit Rechnungen durchführt so wird dies meist langsammer sein als mit Int64 oder so. Das muß aber nicht immer so sein, zb. bestimmte Spezial-Algorithmen die in den IInteger enthalten sind wurden in mehere Implementierungen aufgeteilt. Dabei wird je nach Zahlengröße ein andere Algo. benutzt. Dieser Algo. ist dann spezialisiert auf Zahlen odedr Berechnungen m,it bestimmten Schranken. Das ist sehr oft der Fall. Nun, im DECMath sind einige 32-64 Bit Algortihmen drinnen die schneller sind als die RTL.

Bei den Interfaces gibts noch eines anzumerken. Ich bezeichne meine IInteger als "forged Interfaces", weil sie in ihrer Implementierung nicht auf TObject/TINterfacedObject basieren. Meine Interfaces sind stinknormal Records und die wichtigsten Interface Funktionen sind in ASM optimiert (Allozierung, FIFO Stack, Calculation Management).

Interfaces mit TInterfacedObject Implementierungen sind in ihren Aufrufkonventionen von Methoden ziemlich ineffizient.

In kurz: der Impakt der Interfaces ist sehr gering auf die Performance aber je nach Sprache und Funktionalität des Compilers eine weitreichende Entscheidung -> im DECMath eben Prozedurales Konzept mit überladenen Funktionen, sehr kurzen Funktionsnamen und sehr strikter Parametersignatur der Funktionen.


Gruß Hagen

Antigo 16. Aug 2006 17:00

Re: wirklich große Zahlen unter Delphi
 
Also eine Frage hätt ich noch ;)
Ich möchte eine große Zahl einlesen, dafür mache ich folgendes:

Delphi-Quellcode:
 
  NSet(a,edit1.Text);
  Showmessage(NStr(a));
Allerdings werden die Zahlen dann in 5er Päckchen ausgegeben. Ist das so gewollt?

negaH 16. Aug 2006 19:34

Re: wirklich große Zahlen unter Delphi
 
Ja, da man so sehr einfach in 5er Schritten die Anzahl der Stellen der Zahl abzählen kann.

Du kannst dasaber abändern wie du es wünscht ;)

NStr() kann die Binärzahl, interne Darstelung, in insgesamt 63 verschiedene Zahlenbasen umwandeln. Alle Basen von 2 bis 64 und 256 sind möglich. Du kannst die IInteger also mit NStr() zb. zur basis 10 = Dezimal umwandeln, oder Oktal = Basis 8 oder Trinär Basis 3 usw. usw.

Beispiel:

Delphi-Quellcode:
var
  S: TStrFormat;
begin
  NStr(N); // umwandeln nach Default Format gespeichert in der globalen Struktur NStrFormat in Unit NInts.pas

  NStr(N, 2) // umwandeln zu einem Binärzahlenstring
  NStr(N, 16) // umwandeln in einen Hexadezimalen String

  S := NStrFormat;
  S.Base := 10;
  S.Plus := '+';
  S.Minus := '-';
  S.Zero := '0';
  S.DigitsPerBlock := 10; // 10 Ziffern als Block
  S.BlockSep := '-#-'; // die Zeichen -#- zwischen den 10'er Blöcken

  NStr(N, S); // umwandeln in unser eigenes Stringformat
end;

Type
  TStrFormat = packed record          // String-Convertion structure
    Base: TBase;                      // Numberbase
    Plus: array[0..15] of Char;       // String for positive IInteger (+)
    Minus: array[0..15] of Char;      // String for negative IInteger (-)
    Zero: array[0..15] of Char;       // String for zero             (0)
    Comma: Char;
    DigitsPerBlock: Word;             // Digits on one Block
    BlockSep: array[0..15] of Char;   // separator between two blocks (Space)
    BlockPadding: Char;               // left padding char of first block
    DigitsPerLine: Word;              // count of digits in one line
    LineSep: array[0..15] of Char;    // separator after one line (CR+LF)
    LinePadding: Char;                // left padding char of first line
    DigitsChars: array[0..63] of Char; // possible Digits of a valid Numberstring
    FormatChars: array[0..63] of Char; // Numberstrings can contain these chars, but should be ignored
    LeftAlign: Boolean;
    Offset: Integer;                  // Offset to first char that contains digits, NSet(string)
    Precision: Integer;
  end;

var
  NStrFormat: TStrFormat = (
    Base: 10;
    Plus: '';
    Minus: '-';
    Zero: '';
    Comma: ',';
    DigitsPerBlock: 5;
    BlockSep: ' ';
    BlockPadding: ' ';
    DigitsPerLine: 0;
    LineSep: #13#10;
    LinePadding: #0;
    DigitsChars: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';
    FormatChars: ' /\-+;:#~"()[]?_<>!§$%&{}'''#13#10#9;
    LeftAlign: False;
    Offset: 0;
    Precision: 0;
   );

function NStr(const A: IInteger; Base: TBase = 0): String; overload;
function NStr(const A: IInteger; const Format: TStrFormat): String; overload;
Oben mal die Typdeklaration von TStrFormat und die globale Variable NStrFormat die als Default benutzt wird.

Gruß Hagen

Antigo 16. Aug 2006 21:40

Re: wirklich große Zahlen unter Delphi
 
unfassbar was da alles schon vorgefertigt ist. Da braucht man ja nix mehr selber zu machen ^^

Vielen Dank wiedermal ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.
Seite 3 von 3     123   

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