![]() |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
Zitat:
(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:
so ähnlich sahen Produkt_langsam, QuotientModulo_langsam und Potenz_langsam aus :angel2:
// für c := a * b;
c := 0; while b > 0 do begin c := c + a; b := b - 1; end; Zitat:
und nun existieren sie nur noch virtuell als Kommantare Zitat:
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; ... |
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?
|
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) |
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 |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
Zitat:
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:
Das ging auch anfangs gut, also wo ich die Werte noch direkt in das Array eingetragen hatte.
// aus'm Konstruktor
SetzeOperator('+', opDavor, -1, nil); SetzeOperator('-', opDavor, -1, nil); SetzeOperator(',', opDazwischen, -1, nil); SetzeOperator(';', opDazwischen, -1, nil); 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: ![]() |
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:
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
// 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 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:
|
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
ChangeLog [01.07.2009 20°° v1.5] - Rechenfehler aus #67 behoben
Delphi-Quellcode:
dieses Problem tritt hier nicht auf
Plus1(-1) -> -0 statt 0
(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:
diese Sonderfälle werden jetzt geprüft und behandelt
PotenzModulo(x,0,0) -> 1 statt Fehler
PotenzModulo(x,0,1) -> 1 statt 0 PotenzModulo(x,0,-1) -> 1 statt 0
Delphi-Quellcode:
Sonderfall 0 wird nun beachtet und nicht behandelt
Negieren(0) -> -0 statt 0
Delphi-Quellcode:
war auf den Fehler in Negieren zurückzuführen
Quotient(-0,-x) -> -0 statt 0
Produkt(-x,0) -> -0 statt 0 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 ; |
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 |
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] |
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 07:32 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 by Thomas Breitkreuz