Delphi-PRAXiS
Seite 6 von 10   « Erste     456 78     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)

gammatester 30. Jun 2009 09:17

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
Bug:
Code:
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'
Wahrscheinlich benutzt Du ein neuere Version von StringMatheLib, die nicht dabei ist.

himitsu 30. Jun 2009 09:50

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
ja, die Beiden sind neu
Delphi-Quellcode:
* 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;
wollte eigentlich nur noch schnell die Units aufräumen und etwas optimieren, bevor ich alles hochlade

und ups :oops: , blödes Copy&Paste :nerd:

gammatester 30. Jun 2009 10:42

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. Hagen's Beitrag

himitsu 30. Jun 2009 10:52

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.

gammatester 30. Jun 2009 11:48

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).

himitsu 30. Jun 2009 11:52

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:
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
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. :)

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:

gammatester 30. Jun 2009 12:36

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.

himitsu 30. Jun 2009 12:51

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )
 
ups, das mit Summe und Co. ist ein kleiner Fehler im Parser :oops:

so geht es
Code:
Summe(1 , 2)
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:
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:
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);
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:

gammatester 30. Jun 2009 13:01

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:)

himitsu 30. Jun 2009 13:58

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:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Demo5.exe ist eine Exception der Klasse EOutOfMemory mit der Meldung 'Zu wenig Arbeitsspeicher' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Zitat:

---------------------------
Demo5
---------------------------
Ungültige Zeigeroperation.
---------------------------
OK
---------------------------
da dreht Delphi aber auch ganz schön an den Fehlermeldungen :shock: (ist beides die "selbe" Exception)

[add]
da war wohl wirklich ein Fehler in TMatheParser.Berechne > Tausche


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr.
Seite 6 von 10   « Erste     456 78     Letzte »    

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