Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Gibt es in Delphi den Datentyp decimal, wie bei c# ? (https://www.delphipraxis.net/200588-gibt-es-delphi-den-datentyp-decimal-wie-bei-c.html)

kwhk 5. Mai 2019 17:42

Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
In C# gibt es den Typ decimal, damit kann man eine Zahl in einer 16-Bytes-Variablen darstellen. Dabei sind die ersten 14 Byte die Mantisse als Integer-Zahl und die höchsten 2 Byte geben die Anzahl Kommastellen an, wobei das höchste Bit das Vorzeichen der decimal-Zahl darstellt.
Man kann also ziemlich große Zahlen darstellen, damit rechnen, in Strings wandeln u.a.m.
Bei Delphi habe ich nur int64 (8 Bytes) als grösste mögliche int-Zahl gefunden.

Delphi max-hex = 7F FF FF FF FF FF FF FF ( int 64 Bits)
C# max-hex = 7F FF FF FF FF FF FF FF FF FF FF FF FF FF ( int 112 bits )

Gibt es inzwischen auch die Möglichkeit einer int-Zahl mit 112 Bits ?

https://docs.microsoft.com/de-de/dot...ywords/decimal

Andreas13 5. Mai 2019 17:59

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
Hallo Hartmut,

versuch es mal mit der Multipräzisions-Arithmetik-Bibliothek MPArith 1.39.12 von Wolfgang Ehrhardt:

https://sslsites.de/wolfgang-ehrhardt.de/index_de.html

Es ist allerdings die allerletzte Version von ihm (= Gammatester in unserem Forum), da er Anfang des Jahres leider verstorben ist.

Ich benutze seine Routinen seit langem mit großem Erfolg, die eine nahezu beliebige Anzahl an Nachkommastellen (bis in die Millionen) ermöglichen.

Gruß

Andreas

Rudy Velthuis 5. Mai 2019 22:00

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
Zitat:

Zitat von kwhk (Beitrag 1431604)
In C# gibt es den Typ decimal, damit kann man eine Zahl in einer 16-Bytes-Variablen darstellen. Dabei sind die ersten 14 Byte die Mantisse als Integer-Zahl

https://docs.microsoft.com/de-de/dot...ywords/decimal

Nein, gibt es nicht. Aber ich habe eine geschrieben, die komplett kompatibel ist mit C#'s decimal (und etwas schneller). Wurde ausführlich getestet.

Kann man auf meiner Seite finden.

Momentan nur eine 32-bit version (mit viel assembler, daher schnell), aber die 64 bit-Version wird in einigen Tagen online gestellt. Und ich arbeite an einer PURE-PASCAL-Version (also ohne Assembler) für andere Plattformen als Windows.

Übrigens, nur 96 bit eines C#-Decimal (12 byte) sind "Mantisse". Das zeigt die Spezifikation von C# auch: 96 bit Mantisse (3 x 32 bit), 5 bit Exponent (Scale, negativ) und 1 bit Zeichen (Sign):

Zitat:

The binary representation of a Decimal number consists of a 1-bit sign, a 96-bit integer number, and a scaling factor used to divide the integer number and specify what portion of it is a decimal fraction. The scaling factor is implicitly the number 10 raised to an exponent ranging from 0 to 28.
Übrigens, es gibt auch noch ein BigInteger und ein BigDecimal.

Rudy Velthuis 5. Mai 2019 22:11

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
Zitat:

Zitat von Andreas13 (Beitrag 1431605)
Hallo Hartmut,

versuch es mal mit der Multipräzisions-Arithmetik-Bibliothek MPArith 1.39.12 von Wolfgang Ehrhardt:

https://sslsites.de/wolfgang-ehrhardt.de/index_de.html

MPArith war einer der Gründe, dass ich meine eigene BigInteger und BigDecimal geschrieben habe.

Zitat:

Es ist allerdings die allerletzte Version von ihm (= Gammatester in unserem Forum), da er Anfang des Jahres leider verstorben ist.
Probiere doch mal meine Implementationen. Können wie einfache Integer benutzt werden (Operator overloading), es gibt allerdings auch viele Methoden. Ist hochoptimiert.

kwhk 6. Mai 2019 09:06

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
Danke für die vielen Antworten. Ich habe mit einem kleinen C#-Testprogramm versucht festzustellen, wie die Struktur der decimal-Variablen ist.
Hier der Code und das Ergebnis in einer Testdatei
Code:
  FileStream fileStr = new FileStream(@"Y:\HkTestDECIMAL.xyz",FileMode.Create);
  BinaryWriter binWriter = new BinaryWriter(fileStr);

  decimal d1 = 123.4567890123m;
  decimal d2 = -1000000000.00m;
  decimal d3 = 1m / 3m;
  double r3 = 123.4567890123;

  binWriter.Write(d1);
  binWriter.Write(d2);
  binWriter.Write(d3);
  binWriter.Write(r3);

  binWriter.Close();



0000: CB 04 FB 71  1F 01 00 00  00 00 00 00  00 00 0A 00  decimal d1 = 123.4567890123m;
      -------------------------------------  ===== ~~~~~
      |                                            | 
      |                                            +-------- 10 Kommastellen / Vorzeichen + ( 0 000A )
      +----------------------------------------------------- Hex 011F71FB04CB = Dez 1234567890123

0010: 00 E8 76 48  17 00 00 00  00 00 00 00  00 00 02 80  decimal d2 = -1000000000.00m;
      -------------------------------------  ===== ~~~~~
      |                                            | 
      |                                            +-------- 2 Kommastellen / Vorzeichen - ( 1 0002)
      +----------------------------------------------------- Hex 174876E800 = Dez 100000000000

0020: 55 55 55 05  CB 00 B7 14  CA 44 C5 0A  00 00 1C 00  decimal d3 = 1m / 3m;
      -------------------------------------  ===== ~~~~~
      |                                            | 
      |                                            +-------- 28 Kommastellen / Vorzeichen + ( 0 001C)
      +----------------------------------------------------- Hex 0AC544CA14B700CB05555555 = Dez 33333...(28 x 3)

0030: 0B 40 FB 07  3C DD 5E 40                            double r3 = 123.4567890123;
Bei der Variablen d3 = 1/3, also ein Endlosbruch 0,333..., wird in den ersten 12 Bytes die Mantisse und in den letzten 2 Byte werden Anzahl Kommastellen und Vorzeichen gespeichert. Die Bytes 13 und 14 sind immer 00 00. Deren Bedeutung hab ich nicht nicht erkannt, evtl. nur Füllbytes, damit die decimal-Variable insgesamt 16 Bytes groß ist.

Rudy, Deine Version habe ich mir heruntergeladen und werde sie mal probieren. Danke für den Link.

Andreas13 6. Mai 2019 13:16

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
@Rudy Velthuis

Hallo Rudy,

Deine Routinen in DecimalsDevelop.dpr (Stand: 16.06.2010), enthalten im aktuellen decimals.zip lassen sich mit meinem Delphi XE5 Professional NICHT (mehr) kompilieren... Hast Du evt. eine aktualisierte Version?

Danke + Gruß

Andreas

Rudy Velthuis 7. Mai 2019 18:40

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
Zitat:

Zitat von Andreas13 (Beitrag 1431646)
@Rudy Velthuis

Hallo Rudy,

Deine Routinen in DecimalsDevelop.dpr (Stand: 16.06.2010), enthalten im aktuellen decimals.zip lassen sich mit meinem Delphi XE5 Professional NICHT (mehr) kompilieren... Hast Du evt. eine aktualisierte Version?

Danke + Gruß

Andreas

Habe ich gleich ausprobiert. Die unit Console ist nicht notwendig (nur für farbige Ausgabe) und das Problem mit TFormatSettings.

Werde heute Abend noch eine verbesserte Version hochladen.

Rudy Velthuis 7. Mai 2019 20:19

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
Zitat:

Zitat von Rudy Velthuis (Beitrag 1431754)
Werde heute Abend noch eine verbesserte Version hochladen.

Das ist jetzt geschehen. Sollte ab XE2 (also auch in XE5) compilieren.

Andreas13 7. Mai 2019 22:23

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
@Rudy Velthuis

Danke Rudy für Deine prompte Hilfe!

Gruß
Andreas

TurboMagic 8. Mai 2019 20:59

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?
 
Zitat:

Zitat von Andreas13 (Beitrag 1431605)
Hallo Hartmut,

versuch es mal mit der Multipräzisions-Arithmetik-Bibliothek MPArith 1.39.12 von Wolfgang Ehrhardt:

https://sslsites.de/wolfgang-ehrhardt.de/index_de.html

Es ist allerdings die allerletzte Version von ihm (= Gammatester in unserem Forum), da er Anfang des Jahres leider verstorben ist.

Ich benutze seine Routinen seit langem mit großem Erfolg, die eine nahezu beliebige Anzahl an Nachkommastellen (bis in die Millionen) ermöglichen.

Gruß

Andreas

Muss man das dann evtl. irgendwo hin retten (Torry, Jedi...), oder wer finanziert den über den Link angegebenen Webspace?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 Uhr.
Seite 1 von 2  1 2      

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