AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

wirklich große Zahlen unter Delphi

Ein Thema von Antigo · begonnen am 15. Aug 2006 · letzter Beitrag vom 16. Aug 2006
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#21

Re: wirklich große Zahlen unter Delphi

  Alt 15. Aug 2006, 22:43
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
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#22

Re: wirklich große Zahlen unter Delphi

  Alt 16. Aug 2006, 17:00
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?
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#23

Re: wirklich große Zahlen unter Delphi

  Alt 16. Aug 2006, 19:34
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
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#24

Re: wirklich große Zahlen unter Delphi

  Alt 16. Aug 2006, 21:40
unfassbar was da alles schon vorgefertigt ist. Da braucht man ja nix mehr selber zu machen ^^

Vielen Dank wiedermal
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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