![]() |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
Bug:
Code:
Wahrscheinlich benutzt Du ein neuere Version von StringMatheLib, die nicht dabei ist.
StringMatheLib.pas(810)
StringMatheParser.pas(163) Error: Undeclared identifier: 'SummeModulo' StringMatheParser.pas(169) Error: Undeclared identifier: 'DifferenzModulo' StringMatheParser.pas(491) ParserU.pas(5) Fatal: Could not compile used unit 'StringMatheParser.pas' |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
ja, die Beiden sind neu
Delphi-Quellcode:
wollte eigentlich nur noch schnell die Units aufräumen und etwas optimieren, bevor ich alles hochlade
* Function TMathe.SummeModulo(a, b, m: String): String;
Begin Result := Modulo(Summe(a, b), m); End; Function TMathe.DifferenzModulo(a, b, m: String): String; Begin Result := Modulo(Differenz(a, b), m); End; und ups :oops: , blödes Copy&Paste :nerd: |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
Bevor Du optimierst, solltest Du ein grundsätzliches Problem bei dieser Art Parser beseitigen:
Bei Ausdrücken der Art <Term> ::= <Factor1> 'mod' <Factor2> hat man bei Langzahlbibliotheken immer das Problem, daß Factor1 nicht normal ausgewertet werden sollte, sondern wenn der 'mod'-Operator benutzt wird, sollte zuerst Factor2 ausgewertet werden und dann Factor1 via Modulararithmetik mit Modul Factor2. Sonst wirst Du zB praktisch nie eine RSA-Verschlüsselung bzw PotenzMod-Operation mit Nicht-Spielzeugzahlen durchführen können. Gammatester PS: Dies ist auch ein Grund, warum Operatorüberladen bei mod eine kitzlige Sache ist, vgl. ![]() |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
Falls du sowas meinst R := A ^ B mod C:
Da ich bei den Operatoren die Reinfolge der Operationen nicht beeinflussen kann, wird hier immer erst A ^ B gerechnet und dann erst (A^B) mod C, aber dafür ist die Lib Selber erstmal als Klasse ausgelegt, wo es die Funktion ProduktModulo gibt. :zwinker: Die Operatoren ala MOD sind ja nur als "eingeschränktes" Zusatzmodul verfügbar. |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
Ja das meinte ich. Allerdings ist diese Nicht-Implementation doch ein wenig einschränkend für einen Langzahl-Rechner. Aber nun zu etwas Positivem, nämlich ein Bug, der beseitigt werden kann: :wink:
2^3^4 wird als (2^3)^4 geparst und nicht, wie es mathematisch richtig wäre, als 2^(3^4). |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
so, hab mal den 1. Beitrag editiert und alles Neue mit eingefügt.
zusätzlich wurden der Parser und die "Grund"Lib um folgende Funktionen erweitert:
Code:
hier wird dann nix gerechnet, da Operationen in 10-Potenzen ja einfach und vorallem schnell, durch Anhängen von '0'en und durch einfaches Umkopieren erledigt werden können. :)
Produkt10 r = a * 10^b
Quotient10 r = a div 10^b Modulo10 r = a mod 10^b QuotientModulo10 r = a div 10^b und m = a mod 10^b ich hab jetzt allerdings noch nicht alles getestet, aber ich hoff einfach mal es funktioniert diese Funktionen werden dann auch demnächst in die Normalisierungsfunktion mit einfließen (zumindestens teilweise) ach ja, falls sich wer wundert: "Normalisieren" entfernt einfach alle ungültigen Zeichen ... aus "-c1a0-" wird also "-10" ... ich glaub da werd' ich demnächst noch was dran ändern. [add] es ist doch implementiert ... du mußt da einfach nur die Funktion nehmen und nicht die Operatoren :zwinker: und was den behebbaren Bug betrifft, da müßte es doch reichen, wenn ich die Auswertung einfach rückwärts angeh :mrgreen: (wird also hoffentlich beim nächsten Update behoben sein) [edit] Bug ist behoben :mrgreen: (siehe #1) [edit2] jetzt mekert er bei (2^3)^4 oder ging das schon immer nicht :gruebel: |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
Wahrscheinlich bin zu blöd oder Dein Teil mag mich nicht. Wie gebe ich eine Funktion ein? PotenzModulo(????). Aber auch Summe(1,2) mault: Zahl erwartet. Summe( 1 2) mault: Komma erwartet ...
Produkt10('12', 4) oder Produkt10('12', '4') ergeben immer noch 12, statt 4 kannst Du auch 7 oder 42 einsetzen. Da der Code nicht funktioniert, kann ich auch nicht testen ob Produkt10('0',4) = '0000' ist. Nach Quellcodelage schon. Also Test auf 0 bevor 'geshiftet' wird. |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
ups, das mit Summe und Co. ist ein kleiner Fehler im Parser :oops:
so geht es
Code:
Problem, das Komma wird mit zur Zahl genommen (also 1,2 aka 1.2 in Pascal ) ... war blöd, da es sich hier doch eh nur um eine Ganzezahllib handelt :roll:
Summe(1 , 2)
und später wird richtig erkannt, daß in der Zahl kein Komma vorkommen dürfte :stupid: [edit] einfach das ',' aus der Whileschleife entfernen und schon sollte es gehn
Delphi-Quellcode:
Dennoch hab ich vermutlich irgendwo in der Klammerbehandlung ein Fehler, welcher z.B. (2^3)^4 durchdrehn läßt und einen String zerschießt. :wall:
Function TMatheParser.Trenne(Var Liste: TMatheParserListe; Const S: String; i: Integer): Integer;
... End Else If S[i] in ['0'..'9'] Then Begin i2 := i; While S[i2] in ['0'..'9', '.'] do Inc(i2); |
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
So weit OK bei den Funktionen. Das Produkt10-Problem betrifft allerdings die StringMatheLib und bleibt somit bestehen (allerdings kann man jetzt mit dem korrigierten Parser schneller feststellen, daß was nicht stimmt :wink:)
|
Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
das Produkt10(0,4) sollte jetzt gehn :)
beim Füllen mit '0' war der PChar etwas zu hoch (das Inc(P) mußte nach dem P^:='0' rein) und der Fall bezüglich a='0' wird nun auch beachtet. und bezüglich (2^3)^4: Zitat:
Zitat:
[add] da war wohl wirklich ein Fehler in TMatheParser.Berechne > Tausche |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 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