![]() |
Re: wirklich große Zahlen unter Delphi
Zitat:
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 |
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:
Allerdings werden die Zahlen dann in 5er Päckchen ausgegeben. Ist das so gewollt?NSet(a,edit1.Text); Showmessage(NStr(a)); |
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:
Oben mal die Typdeklaration von TStrFormat und die globale Variable NStrFormat die als Default benutzt wird.
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; Gruß Hagen |
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 14:41 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