Delphi-PRAXiS
Seite 8 von 10   « Erste     678 910      

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 1. Jul 2009 09:27

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Zitat:

Zitat von xZise
Naja ich weiß nicht :P Weil P10 macht mehr als an a eine 0 dran zuhängen. Weil P10 halt universell ist.

ein sinnvoller Grund für P10 ist, daß der "Rechenweg" dann "versändlicher" wäre,
(es ist ja eigentlich ein *10 und im Code sieht es nach +0 aus)
nja und daß es sozusagen Insert, statt Concat (+) nutzt :stupid:

weißt du, was eine langsame Multiplikation ist?
Delphi-Quellcode:
// für c := a * b;
c := 0;
while b > 0 do
begin
  c := c + a;
  b := b - 1;
end;
so ähnlich sahen Produkt_langsam, QuotientModulo_langsam und Potenz_langsam aus :angel2:

Zitat:

Zitat von xZise
Aber ganz von der Hand zu weisen ist das Bestreben nach schnelleren Code ja auch nicht :D

ich hatte anfangs ja die "langsamen" Versionen noch als zusätzliche Extraversionen drin
und nun existieren sie nur noch virtuell als Kommantare

Zitat:

Zitat von gammatester
In Ord(TMatheParserFListe(Liste[i + 1].Operanden)[i3].Operand) wendest Du ord auf einen String. Kann mir eigentlich keine Delphiversion vorstellen, die das erlaubt.

String ist ein Zeiger und per Ord würde man wohl den "Pointer" in einen Integer casten :nerd:


sooo, nun müßte nur noch irgendwer alle möglichen restlichen Testfälle zusammenstellen :freak:
Delphi-Quellcode:
// Function StringMatheLib.UnitTest:
With TMathe.Create do
  Try
    _Test(Normalisieren(  '123') = '123');
    _Test(Normalisieren( '+123') = '123');
    _Test(Normalisieren( '-123') = '-123');
    _Test(Normalisieren('--123') = '123');
    Try
      _Test(Normalisieren('a123') <> '123');
      _Test(False);
    Except
    End;
    _Test(Formatieren('+1234567', False, False) = '1234567');
    _Test(Formatieren('-1234567', False, False) = '-1234567');
    _Test(Formatieren('+1234567', True, False) = '1.234.567');
    _Test(Formatieren('-1234567', True, False) = '-1.234.567');
    _Test(Formatieren('+1234567', True, True) = '+1.234.567');
    _Test(Formatieren('-1234567', True, True) = '-1.234.567');
    _Test(Formatieren('+1234567', True, False, 15) = '0000001.234.567');
    _Test(Formatieren('+1234567', True, True, 15) = '+000001.234.567');
    _Test(Formatieren('-1234567', True, False, 15) = '-000001.234.567');
    _Test(Formatieren('-1234567', True, True, 15) = '-000001.234.567');
    //
    //Function Vergleich      (a, b: String): TValueRelationship;      Overload;
    //Function Vergleich      (a, b: String; Art: TVergleich): Boolean; Overload;
    //Function istPositiv     (a:   String): Boolean;
    //Function istNegativ     (a:   String): Boolean;
    ...

gammatester 1. Jul 2009 11:37

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Ohne nerven zu wollen, aber in beiden Zips ist die alte Version von StringMatheParser.pas (29.719 01.07.09 0:22) und der Fehler tritt bei mir immer noch auf. Da die Exes von heute 10Uhr sind, mußt Du sie doch irgendwie kompiliert haben!? Willst Du ernsthaft sagen, daß Dein Delphi die StringMatheParser aus den Zips ohne Fehler übersetzt?

himitsu 1. Jul 2009 12:10

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Liste der Anhänge anzeigen (Anzahl: 1)
hab grad die Browsercache geleert, alles selber runtergeladen und vergleichen lassen ...
oben ist die aktuelle Version.

hatte es getestet und kompilieren lassen und danach gepackt und hochgeladen.

hab's auch grad nochmal (mit der Demo6) unter Delphi 7 versucht, und bis auf einige Sachen in den .DFMs, welche man ignorieren kann und dem Application.MainFormOnTaskbar:=True; in der .DPR lief es sofort (der Debugger bemängelt nur, zu recht, eine Exception im UnitTest, welche absichtlich ausgelößt und per Try-Except abgefangen wird)

gammatester 1. Jul 2009 12:13

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Habe gerade von einem Kollegen erfahren, daß Uni-Code D2009 den Parser mit dem kritschen Teil zwar übersetzt, aber alle Funktion mit mehr als einem Argument scheinen nicht mehr zu funktioniern. (Wäre nach Deinem "Argument" auch kein Wunder, den der Ord(Pointer) wir wohl nie ',' oder so sein)

Edit: Seine Prä-2009-Versionen erzeugen den gleichen Fehler wie bei mir

himitsu 1. Jul 2009 13:37

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Zitat:

[01.07.2009 14²° v1.4]
- einige Dateien von UTF-8 nach Ansi konvertiert
- wegen #72 Version erhöht und alles neu kompiliert bzw. hochgeladen
- weitere Konstanten in die Parser eingefügt
wie gesagt, mit D7 hatte ich keine großen Probleme
und in D2009 lief es sowieso

werd' gleich nochma TDE versuchen


wobei Ord(Pointer) eigentlich schon seit 10°° behoben sein sollte :gruebel:
ich probier das mit den Parametern aber gleich nochmal aus.
[edit] ok, da stimmt wirklich was nicht ... mal sehn was da los ist [/edit]
[edit2] bin blöd, hab es nur in einem der zwei Parser geändert :wall: [/edit2]


und ich hoff die Kompilerschalter, bei den Konstanten, funktionieren (in D7 ging es zumindestens),
damit werden die Unicode-Versionen, wie Φ und π ausgeschlossen.

[add]
OK, erstmal hatte ich das Ord(Pointer)-Problem einmal übersehn

und dann hatte ich doch vor Kurzem die Verwaltung der Operatoren, Konstanten und Funktionen überarbeitet und mit neuen Funktionen versehn, wie z.B. SetzeOperator.

Nun wird intern z.B. das Komma nicht extra behandelt, sondern einfach zusammen mit den anderen Operatoren.
Delphi-Quellcode:
// aus'm Konstruktor
SetzeOperator('+', opDavor,     -1, nil);
SetzeOperator('-', opDavor,     -1, nil);
SetzeOperator(',', opDazwischen, -1, nil);
SetzeOperator(';', opDazwischen, -1, nil);
Das ging auch anfangs gut, also wo ich die Werte noch direkt in das Array eingetragen hatte.
Nun hat die SetzeOperator-Funktion die eigenschaft, daß sie einen Eintrag löscht, wenn keine Funktion (nil) übergeben wird und demnach nicht die "internen" Verwaltungs-Operatoren anlegte ... die fehlten also, wodurch eben auch kein Komma mehr erkannt wurde :wall:

Download in #1 aktuelle Version v1.4 14:30

himitsu 1. Jul 2009 17:42

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Einen "kleinen" Fehler in der Division hab ich noch entdeckt, da wurde bei der letzen Umstellung ein Vergleich mit einem "falschen" Wert gemacht, welcher vorher zu früh auf "1" gesetzt wurde.
OK, da das nur die interne optimierung betraf, wurde zwar immernoch richtig gerechnet, aber leider wurde mit steigender Dezimalstellenanzahl (der Stellen-Differenz zwischen Divisor und Dividend) die Berechnung expotentiell zur Stellenanzahl verlangsamt :?

Dann hab ich mal einige Stringoperationen beim Vergleich entfernt
und wenn dann demnächst eine "neue" Normalisierungsfunktion vorhanden ist, wird bei bereits normalisierten Zahlen keine Stringoperation/-veränderung mehr erforderlich sein, also nur noch ein "reiner" Vergleich. :stupid:
Delphi-Quellcode:
// vorher
Function TMathe.Vergleich(a, b: String): TValueRelationship;
  Begin
    _Formatieren(a, False, True);
    _Formatieren(b, False, True);
    If     (a[1] = '-') and (b[1] = '+') Then Result := LessThanValue
    Else If (a[1] = '+') and (b[1] = '-') Then Result := GreaterThanValue

// jetzt
Function TMathe.Vergleich(a, b: String): TValueRelationship;
  Begin
    If _ImmerNormalisieren Then Begin
      _Normalisieren(a);
      _Normalisieren(b);
    End;
    If     (a[1] = '-') and (b[1] <> '-') Then Result := LessThanValue
    Else If (a[1] <> '-') and (b[1] = '-') Then Result := GreaterThanValue

Das Nachkommaproblem bei Potenz10, Produkt10 und Quotient10, im Fließkommaparser, ist jetzt behoben,
aber für Potenz hab ich keine wirkliche Lösung, außer daß ich da wohl eine komplett eigene Potenz-Funktion (nur für den Parser) erstellen müßte,
denn so wäre das nicht wirklich effektiv,
Delphi-Quellcode:
// in Ganzzahl umwandeln
a := Trunc(a * (10 ^ n));
b := Trunc(b * (10 ^ n));

// rechnen
Result := Mathe.Potenz(a, b);
Result := Mathe.Quotient(Result, 10 ^ (n * b-1));

// wieder in natürlichen Zahl umwandeln (mit Komma)
Result := Result / (10 ^ n);

// n = Anzahl der Nachkommastellen
da dann abhängig von den Nachkommastellen ein sehr großes Zwischenergebnis entsteht ... also dieses wäre a*10^n ^ b*10^n = 20*10^100 ^ 50*10^100
102 ^
20^50 bei 100 Stellen nach'm Komma = statt einer 65-stelligen Zahl eine mit über 5e103 Dezimalstellen :shock:


Nja, aber erstmal schau ich nach den Rechenfehlern, welche noch auf Seite 5 erwähnt wurden.

[add]
Zitat:

[01.07.2009 19°° v1.4]
- Verzögerungsfehler in Division entfernt, welcher die Rechenoptimierung abschaltete (#76)
- Vergleichsfunktion optimiert (#76)
- Potenz10, Produkt10 und Quotient10 in StringMatheParserFloat.pas berichtig und freigegeben (Nachkommastellenproblem #76)


himitsu 1. Jul 2009 18:59

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
ChangeLog
[01.07.2009 20°° v1.5]
- Rechenfehler aus #67 behoben


Delphi-Quellcode:
Plus1(-1)            -> -0  statt 0
dieses Problem tritt hier nicht auf
(wie vermutzt, wird es durch die "Normalisierung" behandelt)

eventuell lag es ja an einem Fehler der Normalisierung, welchen ich vorhin schon behoben hatten :gruebel:

Delphi-Quellcode:
PotenzModulo(x,0,0)  -> 1  statt Fehler
PotenzModulo(x,0,1)  -> 1  statt 0
PotenzModulo(x,0,-1) -> 1  statt 0
diese Sonderfälle werden jetzt geprüft und behandelt
Delphi-Quellcode:
Negieren(0)          -> -0  statt 0
Sonderfall 0 wird nun beachtet und nicht behandelt
Delphi-Quellcode:
Quotient(-0,-x)      -> -0  statt 0
Produkt(-x,0)        -> -0  statt 0
war auf den Fehler in Negieren zurückzuführen


PS: laß dir mal im Debugger das e anzeigen ... vonwegen -0 gäbe es nicht :lol:
Delphi-Quellcode:
e := 0;
PByte(@e)[9] := $80;
if e = 0 then ;

GPRSNerd 3. Jul 2009 08:21

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Hallo himitsu,

bei deiner Demo1 werden jetzt bei allen Ausgaben, die keine Zahlen sind, Fehlermeldungen geworfen, a la "ungültige Zahl ""a ist größer als b"".
Kann man das irgendwie abschalten oder habe ich was übersehen?

Gruß,
Stefan

himitsu 3. Jul 2009 10:19

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
OK, das hatte ich nicht beachtet :oops:

Ich schau gleich mal, aber ich hab 'ne Befürchtung :nerd:

Nach der Berechnung wird doch die Dezimalstellenanzahl ermittelt und mit angezeigt.
Und ich denk mit jetzt einfach mal, daß dabei die "neue" Exception in der Zahlenprüfung zuschlägt -.-°
(bis vor Kurzem wurden in der Normalisierung einfach stillschweigend alle ungültigen Zeichen gelöscht und nun gibt's halt 'ne Exception)

ich glaub statt die Demo umzuschreiben, werd ich die Zählfunktion umschreiben und dort die Exception abfangen und dann "0" zurückgeben.

Oder sollte ich lieber "-1" machen :?: (gültige Zahlen haben immer mindestens eine Stelle)


[add]
hab doch die -1 genommen

ChangeLog
[03.07.2009 12°° v1.5]
- Dezimalstellenfunktion mit Fehlerprüfung versehen und die Anzeige der Stellen in den Demos etwas umgestellt[/size]

qwertz543221 3. Jul 2009 16:31

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
entschuldige, aber bei welchem beitrag finde ich die aktuelle version deines meisterwerks


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 Uhr.
Seite 8 von 10   « Erste     678 910      

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