Delphi-PRAXiS
Seite 2 von 10     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Mathe mit Strings (die deutsche StringMatheLib ._. ) (https://www.delphipraxis.net/135569-mathe-mit-strings-die-deutsche-stringmathelib-_.html)

himitsu 15. Jun 2009 11:45

Re: die deutsche StringMatheLib ._.
 
ahhhh, dann haben die das wohl doch schon ausgebessert :shock:

hatte mal das Problem hiermit,
Delphi-Quellcode:
Var W: WideChar;

W := '0'; // #$0034
If W in ['0'..'9'] Then ShowMessage('a');
W := #$1034;
If W in ['0'..'9'] Then ShowMessage('b');
wo einfach nur der obere Teil abgeschnitten wurde und am Ende auch 'b' angezeigt wurde :wall:

na gut, aber die Warnmeldung gefällt mir dann dennoch nicht,
vorallem wo Delphi schon seit vielen Jahren auch mit mehr, als einem Byte klarkommt, solange es die Möglichkeit zum Kürzen/Optimieren hat ... Integer und Word sind ja locker möglich, nur WideChar (=Word) nicht :?


nja, ...
- MatheString jetzt als String
- der Operatoren-Record in MatheString umbenannt
- und gegen die nervigen Compiler-Hinweise hab ich auch was garnicht soooooo unschönes gefunden :angel2:
- einige fehlende Dinge noch in den Record durchgeschleift
- alle Dateien im Post #1 geupdatet

gammatester 15. Jun 2009 13:30

Re: die deutsche StringMatheLib ._.
 
Bevor Du die Sache weiter ausbaust, hier ein paar Bugs/Features :)

- QuotientModulo('7','-3') liefert Quotient -2, Rest -1. Richtig ist Quotient -2, Rest +1. Es ist zwar immer wieder ein Graus, daß -7 mod 3 = -1 sein soll (und nicht 2), aber das ist wenigstens mit Pascal kompatible.

- Sinnvoll ist mM auch die Verwendung von Fehler "reRangeError" bei Wurzeln, Potenzen etc; denn "reInvalidOp" liefert "Invalid floating point operation" und das ist bei einer Ganzzahlbibliothek doch etwas unerwartet.

R2009 15. Jun 2009 13:51

Re: die deutsche StringMatheLib ._.
 
Hm äähm,

mir verschliesst sich momentan der Sinn des Ganzen.
Für was benutzt man diese Unit. Rechnen kann ich ja auch so oder?

Für die Addition:
c:=floattostr(strtofloat(a)+strtofloat(b))
Warum dann der immense Aufwand?

Das ist doch alles, oder entgeht mir da was?

Viele Grüsse!

alzaimar 15. Jun 2009 14:17

Re: die deutsche StringMatheLib ._.
 
Zitat:

Zitat von R2009
mir verschliesst sich momentan der Sinn des Ganzen.

Spass.

Zitat:

Zitat von R2009
Rechnen kann ich ja auch so oder? Für die Addition:
c:=floattostr(strtofloat(a)+strtofloat(b))
Warum dann der immense Aufwand?

Deswegen
Delphi-Quellcode:
a := '1'+ StringOfChar('0',10000000000);
b := '2'+ StringOfChar('1',maxint);
c:=floattostr(strtofloat(a)+strtofloat(b))
:zwinker: Die Unit ist zum genauen Rechnen mit großen (sehr großen) Zahlen gedacht.

Zitat:

Zitat von R2009
Das ist doch alles, oder entgeht mir da was?

Jep.

qwertz543221 15. Jun 2009 14:23

Re: die deutsche StringMatheLib ._.
 
ja schon, aber hier geht es um großere ganzzahlen als int64, die dargestellt werden sollen

deshalb kann man die normalen, in delphi integrierten, fkt's nicht benutzen

himitsu 15. Jun 2009 14:43

Re: die deutsche StringMatheLib ._.
 
Zitat:

Zitat von R2009
mir verschliesst sich momentan der Sinn des Ganzen.
Für was benutzt man diese Unit. Rechnen kann ich ja auch so oder?

jetzt versuche es mal mit "größeren" Zahlen

Die Funktionen, welche dir Delphi/der PC bietet, arbeiten maximal mit 20 Dezimalstellen ... wenn die Zahl mehr Dezimalstellen hat, dann sind die Nachfolgenden Aufgrund der internen Art der Speicherung undefiniert, also bei Extended und Co.
Int64 hat maximal 19 Dezimalstellen.

Hier sind weit mehr Dezimalstellen möglich.

Ansonsten hat es, so wie diese Lib aufgebaut ist, mehr einen spielerischen Lernfaktor.
(hier ist zwar viel möglich, aber nicht unbedingt schnell ... für schnelle Berechnungen gibt es weitaus Beseres, aber es Rechnet "jetzt" immer genau und das bis zu letzten Dezimalstelle und der Code ist recht einfach und Verständlich ... falls mal wer da gern reinguck und etwas verstehen will)


In ein/zwei Minütchen sind dann auch alle Dateien wieder UpToDate und ohne diesen Fehler bim MOD :oops:
(hatte die Vorzeichen einfach nur falsch behandelt)

qwertz543221 15. Jun 2009 14:50

Re: die deutsche StringMatheLib ._.
 
ach ja, himitsu.

wenn ich jetzt noch wüsste, wie ich die lib in meine unit einbinde, und die fkt's benutze, dann wäre alles super.
weitere fehler habe ich keine gefunden beim test, aber benutzen würde ich sie schon gerne in meinem project.

nochmal danke für die mühe

thx

himitsu 15. Jun 2009 15:11

Re: die deutsche StringMatheLib ._.
 
Ja eigentlich recht einfach

- erstmal entscheiden, welche Version man möchte
> mit Objekt (diese wäre auch Threadsicher, wenn je Thread ein eigenes Objekt genutzt würde)
> als Record/MatheString

Delphi-Quellcode:
Uses StringMatheLib;      // Unit eintragen

Var Mathe: TMathe;        // an passender Stelle das Objekt definieren
  a, b, c: String;        // Variablen definieren

Mathe := TMathe.Create;   // dieses Objekt erstellen

a := '123';               // nun dieses benutzen
c := Mathe.Summe(a, b);   // ...
c := Mathe.Potenz(a, b);  // 
Edit1.Text := c;
Edit2.Text := Mathe.Format(c, True, False);
...

Mathe.Free;               // und am Ende noch aufräumen
Delphi-Quellcode:
Uses StringMatheRec;     // Unit eintragen

Var a, b, c: MatheString; // Variablen definieren

a := '123';               // nun dieses benutzen
c := a * b;               // ...
c := Power(a, b);         //
Edit1.Text := c;
Edit2.Text := c.Format(True, False);
...

// hier wird das nötige TMathe-Objekt intern automatisch erstellt und freigegeben

gammatester 15. Jun 2009 15:13

Re: die deutsche StringMatheLib ._.
 
Noch ein schwerer Bug in PotenzModulo sollte es heißen
Delphi-Quellcode:
While Vergleich(b,'0',vGroesser) do Begin
statt "istPositiv(b)", denn sonst kommt man in Endlosschleifen zb für 2^11 mod 13.

gammatester 15. Jun 2009 15:20

Re: die deutsche StringMatheLib ._.
 
Zitat:

Zitat von qwertz543221
weitere fehler habe ich keine gefunden beim test, aber benutzen würde ich sie schon gerne in meinem project.thx

Du willst doch RSA implementieren. Da ist die wichtigste Operation PotenzModulo. Wenn Du den von mir gefundenen Bug beseitigt hast, solltest Du unbedingt mal ausprobieren wie lange Dein Projekt rechnet. Bei mir im Sekundenbereich für 64 Bit. Also wird wohl alles über 128 Bit illusorisch (wahrscheinlich schon viel früher). Und 512-1024 Bits sollten es schon sein. Es sei denn, Du willst nur das Prinzip versehen, aber dafür hätten ach int64 gereicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.
Seite 2 von 10     12 34     Letzte »    

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