Entwickler-Ecke

Open Source Projekte - pi - Matheparsertaschenrechner


Martok - Fr 15.07.11 20:57
Titel: pi - Matheparsertaschenrechner
π - Matheparser/Taschenrechner


Das Projekt "π"/"Pi" habe ich gestartet als einen Ersatz für den Windows-Taschenrechner, hauptsächlich um es selbst zu verwenden: mich hat immer gestört, dass das Eingeben längerer Ausdrücke nicht unbedingt einfach ist. Ein Ausdrucksparser musste also her, und das ganze mit einer zusätzlichen Anforderung: per ac'tivAid [http://www.heise.de/ct/activaid/] habe ich nämlich den Taschenrechner auf einem Shortcut, es soll also sehr schnell starten. Ein komplettes CAS fällt da natürlich aus ;)


Aktuelle Version
Die aktuellen Quellen finden sich immer auf Github [https://github.com/martok/pi], hier gibts lediglich vereinzelte Binaries.
Aktuell: Version 9 (zip, 696.36 KB).


Funktionen
Screenshot (png, 20.39 KB)
Erstelltes Diagramm (png, 44.53 KB)
Intern wird mit 80bit Extended gerechnet, das sollte ausreichend sein: "Harry knew pi out to 3.141592 because accuracy to one part in a million was enough for most practical purposes. Hermione knew one hundred digits of pi because that was how many digits had been printed in the back of her math textbook."* [http://www.fanfiction.net/s/5782108/9/]

Handbuch [https://raw.github.com/martok/pi/master/bin/documentation.html]

Code-Überblick [https://github.com/martok/pi/wiki/Hacking-Guide]



How To Build
Verwendet habe ich Delphi 7. Es sollte keine Unicode-Probleme geben, aber getestet ist das auf nichts neuerem. (Update: FinnO sagt mir, dass TreeNT ein Problem ist. Kann man aber unfallfrei ersetzen, sieht dann nur altmodischer aus).

Stimmt nicht mehr! Hier nur noch als Archiv:Einzige verwendete Fremdkomponente ist TTreeNT [http://www.soft-gems.net/index.php/controls/treent] von Mike Lischke.
ACHTUNG: in Zeile 4955 dort ist ein Bug! Korrekt müsste die lauten:

Delphi-Quelltext
1:
StrLCopy(Item.pszText, PChar(Node.Text), Item.cchTextMax-1);  // SH 2011-08-28: leave room for final #0                    

Ein Patch findet sich bei GitHub [https://github.com/downloads/martok/pi/treent-fix-long-titles.patch].



Geplant
Wie gesagt, noch ist das Ganze lange nicht fertig. Geplant sind noch einige Dinge, aber für eine Einzelperson ist das doch etwas zeitfressend ;-)
Eine mehr oder weniger (un)vollständige Wunschliste pflege ich auf Github [https://github.com/martok/pi/issues].


acnut - Fr 15.07.11 21:09

also mir gefällts ;)
von der schriftart und von der "oerfläche" her ähnelt es dem derive programmen von ti und das gefällt mir auch sehr ;)

was nett wäre: wenn ich z.b 2+2 und dann enter drücke und dann weiterrechne möchte mit den rechenoperatoren z.b /*-+ dann funkt das nicht und ich krieg eine zugriffsverletzung. besser wär also gleich von selbst ans zu schreiben und dann/*-+



ich wünsch dir erfolg bei der weiterentwicklung und warte gespannt auf die neue version ;)


Teekeks - Fr 15.07.11 23:32

Ah!
Veröffentlichst du den jetzt.
Finde ich gut!


Narses - Fr 15.07.11 23:53

Moin!

Sieht vielversprechend aus, ich werd´s auch mal verfolgen. :zustimm:

cu
Narses


Martok - Mo 01.08.11 04:24

So, erstmal: wow, ganz schön viele Reaktionen :oops:

user profile iconacnut hat folgendes geschrieben Zum zitierten Posting springen:
was nett wäre: wenn ich z.b 2+2 und dann enter drücke und dann weiterrechne möchte mit den rechenoperatoren z.b /*-+ dann funkt das nicht und ich krieg eine zugriffsverletzung. besser wär also gleich von selbst ans zu schreiben und dann/*-+
Die Zugriffsverletzung war ein "falscher Fehler", da hätte eigentlich ein Syntax Error kommen sollen.
Das mit dem Weiterrechnen ist mir auch aufgefallen, aber nicht so ganz einfach. Das funktioniert, wenn ich mit dem Ergebnis etwas tun will, was "rechts dran" kommt. Aber wenn ich z.B. eine Funktion drauf anwenden will, nutzt mir das vorausgefüllte nix, es stört sogar eher. Ich hab das mal am Taschenrechner (also, Hardware ;) ) getestet: Casio fügt bei Eingabe eines Operators als ersten Tastendruck nach dem '=' automatisch 'Ans' davor ein, bei allem anderen nicht. Müsste ich mal sehen, wie man das sauber hinbekommt.


Jedenfalls: ich habe jetzt endlich mal Zeit gefunden, den ersten Beitrag zu überarbeiten. Dabei ist er gleich ungefähr 3mal so lang geworden :roll: Dafür steht da jetzt wirklich alles drin, was man wissen muss :)
Außerdem ist der Parser komplett neu geschrieben... das mit dem Auto-Balancing Tree war eher nix. Jetzt wird ordentlich Tokenized, da funktionieren dann auch seltsam verschachtelte Klammerwälder ordentlich. Führt allerdings auch dazu, dass viele Operator-Fehlverwendungen einfach nur mit "Leftover Token" quittiert werden. Naja. Man kann ja nicht alles haben :zwinker:


Martok - So 07.08.11 05:39

Und wieder ein Update. Diesmal ist der 1. Beitrag wieder kürzer geworden :)
Dafür gibt's die Dokumentation in einem separaten (oben verlinkten) Dokument [https://github.com/martok/pi/blob/master/README.md].

Außerdem neu: Bugfixe bei Funktionen/Expressions ohne Argumente und unerwarteten Zeichen und 3 neue Funktionen, die Kontexte anlegen (new), löschen (drop) und Variablen daraus löschen (undef).


Frage in die Runde: welche Konstanten könnte man denn so brauchen? Ich könnte jetzt einfach mal unsortiert die Konstantenliste aus'm Tafelwerk abschreiben, aber da ist dann ja viel dabei das keiner braucht.


Boldar - So 07.08.11 14:10

Naja... willst du Mathematiker Oder auch andere Naturwissenschaftler ansprechen?
Potentiell gesehen wären dass sehr viele konstanten. Mach doch einfach eine ini-Datei dafür, dann kann jeder sich selbst benötigte Konstanten hinzufügen.


acnut - So 07.08.11 14:46

also ich würde beide gruppen ansprechen, da man es am ende der breiten masse freigeben kann.

also im anhang findest du die physikalischen konstanten, die laut dem lehrer wichtig für meine matura waren.
und mathe-konstanten hab ich nur als formelheft zur verfügung :( wirst aber leicht im net finden ;)


mfg
acnut


Martok - Mo 08.08.11 05:08

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Naja... willst du Mathematiker Oder auch andere Naturwissenschaftler ansprechen?
Wie mir immer wieder gesagt wird: Mathematiker rechnen nicht. Scheint auch zu stimmen, da gibts außer Pi, e und dem Goldenen Schnitt nicht viel...

user profile iconacnut hat folgendes geschrieben Zum zitierten Posting springen:
also ich würde beide gruppen ansprechen, da man es am ende der breiten masse freigeben kann.
Ja, denke ich auch. Ich brauche ja selber mehr Ingenieur-Zeugs, also schon einen großen Teil der physikalischen. Aber eher weniger Astrophysik :P


user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Potentiell gesehen wären dass sehr viele konstanten. Mach doch einfach eine ini-Datei dafür, dann kann jeder sich selbst benötigte Konstanten hinzufügen.
Das wird es später über ausführbare Skripte geben, denke ich. Geht hier erstmal um die "Grundausstattung".

Ich bau da grade sowas ähnliches wie Mathematica: eine Funktion, die man dann nach dem Langnamen der Konstante fragen kann:

Quelltext
1:
2:
>  const('SpeedOfLight')
=  299792458

Einige wenige davon werden dann standardmäßig in den Constants-Kontext geladen; weitere kann man sich natürlich einfach in Variablen kopieren.

Außerdem kann man abfragen, als was eine Konstante definiert ist:

Quelltext
1:
2:
>  constinfo('Boltzmann')
=  Boltzmann = 1.38065E-23 [J/K] (MolarGasConstant/Avogadro)
constinfo() ohne Parameter gibt eine Liste aller bekannten Konstanten aus.


user profile iconacnut hat folgendes geschrieben Zum zitierten Posting springen:
also im anhang findest du die physikalischen konstanten, die laut dem lehrer wichtig für meine matura waren.
und mathe-konstanten hab ich nur als formelheft zur verfügung :( wirst aber leicht im net finden ;)
Und wieder einmal zeigt sich, dass Sachsen-Anhalt-Abitur schwerer ist als der Rest der Welt. Bei uns waren immer 5 signifikante Stellen Minimum. Mit deinen Werten kann man ja fast Kopfrechnen ;)


Erster Schuss, ihr könnt ja mal einen Blick drauf werfen: Github Diff [https://github.com/martok/pi/commit/09c42fd4e799c0013eec4779d71d8651973486ec#diff-1]


Martok - So 28.08.11 19:22

Nach ein paar Tagen basteln ist mal wieder ein Stand erreicht, den man vorzeigen kann.

Link ist oben; Änderungen gegenüber TP3:
- viele Bugfixes/Verbesserungen in der Richtung dass der Parser logischer wird
- das im letzten Beitrag vorgestellte Konstanten-zeugs
- das Komma auf dem Ziffernblock wird jetzt in den neutralen Dezimaltrenner '.' übersetzt
- Nach einer Berechnung wird das Eingabefeld mit 'ans' vorbefüllt: entweder überschreiben oder einmal "Pfeil rechts" und weiter verketten
- Ausgaben haben jetzt schmale Leerzeichen als Tausendertrenner (Mathematica... mal wieder)
- Listen.

Listen können per L() oder Range()-Funktion erstellt werden, siehe Readme. Darauf kann man dann mit Each() itererieren und eine neue Liste der gleichen Länge bekommen, oder auch per Aggregate() Aggregate (z.B. Summe, Produkt über einer Reihe) berechnen. Mehrere Listen verkettet man per Merge()
Spannend dabei ist, dass das ganze relativ speichereffizient ist (Eine Liste von 2 Mio typvarianten Werten umfasst knapp 30MB). Man sieht allerdings auch, dass ich nicht wirklich auf Geschwindigkeit optimiert habe: diese per Aggregate zählen dauert dann fast 15 Sekunden ;)
Für kleinere Bereiche ist das allerdings völlig ausreichend; für die geplanten Statistik-Tools auf wenigen (maximal einige hundert) Messwerten gut genug.

Wer das jetzt auf XE compilieren möchte, bitte mal Blogeintrag [http://www.martoks-place.de/2011/08/trust-me/] beachten. Ich garantiere da für nichts mehr ;-)
Dafür gibt's jetzt die Binaries in GitHubs Downloads-Paket-Dings (oder nach wie vor oben verlinkt).


NoLe_Kazuik - Mo 29.08.11 10:10

Hallo Martok,

dein Parser find ich echt gut, aber könntest du deine Readme vielleicht als PDF oder so offline mit zur Verfügung stellen und diese mit deinem Programm verzippen und beides zusammen liefern?!

Oder die Readme zusätzlich mit in dein Programm einbauen. Das wäre auch ne gute Lösung.


Martok - Mi 31.08.11 16:19

Meinst du, es gibt Leute die ein Handbuch lesen würden? :D

Ja, das mit dem Einbauen scheint keine schlechte Idee zu sein. Mal sehen, wie ich das am einfachsten mit möglichst wenig Aufand hinbekomme.


Dude566 - Mi 31.08.11 18:18

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Meinst du, es gibt Leute die ein Handbuch lesen würden? :D


Im nachhinein, wenn etwas wirklich nicht so klappt wie man es wünscht, dann kann auch so etwas mal passieren. :D


Martok - Mi 12.10.11 20:07

Hey, es lebt noch ;)

Nachdem ich festgestellt hab, dass da ein ganz dummer Operator-Precedence-Fehler drin war, hier eine Version die auch richtig rechnen kann :roll:

Der Download ist jetzt ein Archiv zusammen mit der Readme, welche auch direkt im Programm angezeigt werden kann. Wenn mir jemand einen Markdown->RichEdit-Formatter findet, auch "in hübsch".

Es gibt ein neues Kommando: Clear() leert die Konsole.

Und da wir jetzt endlich richtig rechnen können, hab ich mich entschlossen, das ganze nicht mehr Tech Preview zu nennen, sondern jetzt echt "Version 1".


Downloadlink ist im ersten Beitrag.


BenBE - Do 13.10.11 00:30

Getreu dem Motto:
DeddyH [http://www.delphipraxis.net/members/24414-deddyh.html]:
Wenn Dein Programm nicht macht, was es soll, nenn es einfach "Version 1.0"


Martok - Do 26.01.12 16:13

Ihr habt bestimmt gedacht, ihr seid mich los?
Falsch gedacht, ich arbeite ab und zu noch dran :twisted:

Grade eben hab ich Version "V2" hochgeladen. Neuerungen:
- Values von Objekten auf Interfaces umgestellt und komischen Hack beseitigt
- geringfügig beschleunigt, etwas speicherschonender gemacht... aber noch nicht wirklich gut
- Listen, in "neu"
- Listen-Accessoren: Part, LGet, (Count)
- CSV lesen
- div. Bugfixes
- Neue Funktionen: Flatten, Sqrt, Nrt, itoa, atoi (ex. ToBase, FromBase), Part, Count, LGet, Pwd, Cwd, CsvLoad

Einfache Statisik (Mean, StdDev) kann man damit machen (wenn auch selbst implementieren), kompliziertere Sachen kommen noch.


Downloadlink ist im ersten Beitrag.


delfiphan - Do 26.01.12 21:00

Erinnert mich ein bisschen an meinen eigenen Taschenrechner irgendwo im Forum. Interessant das "Konkurrenzprodukt" zu sehen ;)

Was man allenfalls noch machen könnte:

* Für einen Mathematiker ist 2^3^4 eher 2^(3^4) und nicht (2^3)^4. Das machen aber auch gewisse Taschenrechner "falsch". Google macht es jedoch "richtig".
* Bei zirkulären Referenzen stürzt das Programm ab: a:=a, oder a:=b,b:=c,c:=a, dann a anzeigen lassen
* Doppelte Minuszeichen werden nicht unterstützt (1 - -2). Nicht so tragisch, man kann ja klammern.
* Imaginäre Zahlen wären zu mindest bei einem wissenschaftlichen Taschenrechner interessant.

Ich bin mir nicht ganz sicher, ob es dir nur um den Spass ging. Denn wenn du wirklich einfach nur einen Taschenrechner dieser Art brauchst, kannst du dir ja Matlab oder Mathematica besorgen, bzw. Open-Source Varianten die Octave.


Martok - Do 26.01.12 21:41

user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
Erinnert mich ein bisschen an meinen eigenen Taschenrechner irgendwo im Forum. Interessant das "Konkurrenzprodukt" zu sehen ;)
Hihi, ja, der tyParser war in der allerersten Version auch drin. Hab aber nicht verstanden, ob ich da irgendwie eigene Funktionen rein bekomme. Daher musste was eigenes her :P

user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
* Für einen Mathematiker ist 2^3^4 eher 2^(3^4) und nicht (2^3)^4. Das machen aber auch gewisse Taschenrechner "falsch". Google macht es jedoch "richtig".
Eigentlich hast du Recht. Hast du noch mehr Beispiele was sowas angeht? Der Parser ist durchgehend linksassoziativ, wenn das öfter anders ist müsste ich mal sehen wie ich die Token nach rechts kollabiert bekomme.
user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
* Bei zirkulären Referenzen stürzt das Programm ab: a:=a, oder a:=b,b:=c,c:=a, dann a anzeigen lassen
Das ist neu, früher gabs da nur eine Exception-Ausgabe EStackOverflow. Das ist auch noch so, aber dabei ist irgendwo eine Memory Corruption und die führt dann zum Crash. Kann man sowas einfach abfangen, ohne einen Stack-Tiefen-Counter mitzuführen?
user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
* Doppelte Minuszeichen werden nicht unterstützt (1 - -2). Nicht so tragisch, man kann ja klammern.
"By Design" ist das neue "not a bug, it's a feature" :P
user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
* Imaginäre Zahlen wären zu mindest bei einem wissenschaftlichen Taschenrechner interessant.
Für mich auch. Das ganze Zahlenhandling hab ich bisher recht oft umgestellt, so ganz zufrieden bin ich noch nicht. Das aktuelle System ist schon fast brauchbar, aber noch ein paar Konzepte weit weg von komplexen Zahlen. Vor allem Unterstützung für die ganzen Funktionen wird schwierig, selbst sin/cos/tan verhalten sich in C ja schon etwas seltsam.
user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
Ich bin mir nicht ganz sicher, ob es dir nur um den Spass ging. Denn wenn du wirklich einfach nur einen Taschenrechner dieser Art brauchst, kannst du dir ja Matlab oder Mathematica besorgen, bzw. Open-Source Varianten die Octave.
Das lustige ist: hab ich alles, wegen Studium und so ;)
Aber die sind eben nix für "mal schnell was ausrechnen". Bis Matlab offen ist, hab ich den halben Parser programmiert :P Gut, Mathematica ist schneller, aber die Syntax ist wenig Copy/Paste-freundlich - die meisten Leute schreiben eben doch lieber runde Klammern.


delfiphan - Do 26.01.12 22:04

Hab recht lange rumprobiert, 2^3^4 war das einzige, was mir aufgefallen ist. Im Prinzip scheint mir da sonst alles in Ordnung :)

EStackOverflow müsste auch nicht unbedingt sein. In meinem Taschenrechner (. [http://www.delphi-forum.de/viewtopic.php?t=46415]) habe ich glaube ich mit Flags oder einer Liste gearbeitet.

Sowas in der Art: Jede Variable, deren Wert ich auflösen muss, markiere ich vor der Auflösung und lösche die Markierung nach der Auflösung wieder. Wenn ich beim Markieren feststelle, dass die Variable bereits markiert war, dann habe ich eine zirkuläre Referenz. Denn dann löse ich ja eine Variable auf, während ich sie auflöse... Da alle Formeln statisch sind und sich während dem Auflösen nicht ändern, muss das in einer Endlosschleife enden... Oder du arbeitest mit einer Liste. Vor jeder Rekursion schreibst du dir auf, welche Variable du gerade versuchst aufzulösen und vor Ende der Rekursion löscht du den Eintrag wieder. Bei einer zirkulären Abhängigkeit hat die Liste doppelte Einträge: a->b->c->a


Tranx - Fr 27.01.12 05:49

Habe jetzt gesehen, dass Du die Konstanten Pi und e schon einfach umgesetzt hast. Wie wäre es mit den anderen Konstanten, die man so benötigt, welche einfach in eine Liste eintragbar sind und dann bei jedem Programmaufruf dann zur Verfügung stehen. Diese Liste könnte man dann auf Abruf anzeigen lassen und sich die Konstante auswählen oder eine neue eingeben ....

Wichtige Konstanten wären m.M. nach c, g, Nl, k, R, Gamma, .... (siehe Tabellenbücher)

Man könnte dann auch griechische Symbole dort als Konstanten einsetzen. Dann kann man die Formeln aus Büchern direkt nachbilden. Auch wäre es sinnvoll, Groß-/Kleinschrift als Unterscheidung zu nehmen, denn in der Physik gibt es t als Symbol für die Zeit und T als Symbol für die Temperatur, oder v = Geschwindigkeit und V = Volumen ....


Martok - Fr 27.01.12 11:56

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Diese Liste könnte man dann auf Abruf anzeigen lassen und sich die Konstante auswählen oder eine neue eingeben ....

Wichtige Konstanten wären m.M. nach c, g, Nl, k, R, Gamma, .... (siehe Tabellenbücher)

Siehe die Funktionen const() und constinfo() :zwinker:


Ladung eines Aluminium(Al_13)-Kerns in Coulomb
1:
2:
3:
4:
5:
>  e=const('ElectronCharge')
=  1.602 176 46E-19

>  13*e
=  2.082 829 397 999 999 68E-18

(Man beachte auch das umdefinieren von "e" im "Work"-Context. Das wird man mit undef('e') wieder los)

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Auch wäre es sinnvoll, Groß-/Kleinschrift als Unterscheidung zu nehmen, denn in der Physik gibt es t als Symbol für die Zeit und T als Symbol für die Temperatur, oder v = Geschwindigkeit und V = Volumen ....
Hm, stimmt. Wäre aber doof, wenn Variablen case-sensitive sind und Funktionsnamen nicht, also müsste ich die auch so machen. Und das wiederum wird etwas unpraktisch :nixweiss:

@user profile icondelfiphan: hab deinen Auflösungs-Stack mal geklaut, funktioniert wunderbar. Beim nächsten mal also drin ;)

EDIT: Beispiel für const()


Martok - Mo 21.05.12 06:19

Törööö, es gibt mal wieder was neues :)
Das, was ich eigentlich für die V3 vorgesehen hatte ist nicht drin, dafür einige andere Sachen die ich nicht länger zurückhalten will (und die mal jemand testen muss :roll:).

Änderungen:
-wie von user profile icondelfiphan vorgeschlagen werden rekursive Definitionen erkannt
-Stringverarbeitung: #123 wie in Delphi, auch: zahl=123, #zahl; Stringverkettung mit || (Oracle-SQL-Stil)
-Laden von CSV-Dateien in mehrdimensionale Listen
-Ausgeben (mehrdimensionaler) Listen im Logfenster mit table()
-hoffentlich weniger fehleranfälliger Modulus für große Zahlen (ist in bestimmten Fällen immernoch unerkennbar(!) falsch, aber die Grenze ist weiter oben. Alles mit weniger als 18 Stellen sollte jetzt okay sein, danach schlägt die Precision zu)
-Zufallszahlen (uniform) mit random()
-bucket(): Erstellen eines Häufigkeitshistogramms
-Funktionsplots und Listen-Diagramme. Potentiell sehr buggy, aber genau nach Handbuch benutzt sollte alles funktionieren.
-Korrekte Ergebnisse/Fehler für Div. durch Null (+/-Inf oder NaN) und logarithmen negativer Zahlen und 0 (NaN und -Inf)

Wichtig für Programmierer:
Nachdem ich das Problem endlich mal gelöst habe, steht der Code jetzt unter einer Dual-Lizenz, Kurzfassung: "Ohne Erlaubnis gar nichts" für kommerzielle Verwendung, MPL 2.0 für alles andere. Genaueres im Handbuch.

Todo:
-Min/Max auf Listen
-Listen als Syntaxfeature: blubb = {1,2,3}. Kreative Ideen für die Formulierung von Listenzugriff (Elementweise) gesucht! [] sind ja schon weg...
-Mindestparameteranzahl für Funktionen mit dynamischen Parametern, damit Fehler erkannt werden können

Downloadlink im ersten Beitrag ist aktualisiert.



Bonus für die die bis hierhin noch dabei sind:

Zum lesen
1:
2:
3:
4:
5:
6:
ndist:= 1/(sqrt(2*pi)*sig) * exp(-0.5*((x-mu)/sig)^2)
stndist:= ndist[mu=0]
rgauss:= sqrt(-2*ln(random())) * sin(2*pi*random())
a = each(range(1,3000,1),x,rgauss)
b = bucket(a, -6,6,23)
show(l(listplot(b,style='bar',color='clRed',size=0.5),plot(stndist[sig=1]*1600,x,l(-3,3))),yrange=l(0,800))


Zum Als-ein-Stück-einfügen
1:
ndist:= 1/(sqrt(2*pi)*sig) * exp(-0.5*((x-mu)/sig)^2), stndist:= ndist[mu=0], rgauss:= sqrt(-2*ln(random())) * sin(2*pi*random()), a = each(range(1,3000,1),x,rgauss), b = bucket(a, -6,6,23), show(l(listplot(b,style='bar',color='clRed',size=0.5),plot(stndist[sig=1]*1600,x,l(-3,3))),yrange=l(0,800))                    
Zeigt einen Vergleich einer idealen Standardabweichung(Linie) mit den kumulierten Wahrscheinlichkeiten von 3000 Würfen eines Box-Muller [http://de.wikipedia.org/wiki/Box-Muller-Methode]-Zufallsgenerators, den ich neulich anderswo verbaut hab. Warum das nicht ohne Rechentricks passt ist mir nicht wirklich klar - rein logisch müsste die 1600 in der letzten Zeile eine 3000 sein. War an der Stelle aber egal, ich brauchte nur einen Generator der ungefähr normalverteilt ist, da hab ich das nicht weiter erforscht ;)


Martok - Sa 20.10.12 00:43

Hach ja, da ist mir wohl irgendwo die V4 hängen geblieben :roll:
Hier ist sie also, zusammen mit ein paar Ergänzungen, die ich heute noch gebaut hab.

Änderungen:
-AtomicUnit war um Faktor 1E6 zu groß
-Listen (endlich!):

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
> liste = {2,4,6,8,10,12}
= {2, 4, 6, 8, 10, 12}

> liste@3
= 8

> liste@-2
= 10

-min(), max() für Listen
-b(), h(), o(): Kurzformen für Basiskonvertierung, erkennt automatisch ob nach oder von Dezimal konvertiert werden soll
-round(), verhält sich wie Delphi Suche in der Delphi-Reference ROUNDTO
-Bugfixes, sollte jetzt mit XE aufwärts compilieren (und dann auch funktionieren)

Downloadlink wie immer im ersten Beitrag.


Mathematiker - Sa 20.10.12 09:14

Hallo Martok,
ich habe Dein Programm (endlich) getestet und kann nur sagen: sehr schön. Die Berechnungen funktionieren tadellos.
Natürlich habe ich aber einen Spezialwunsch. Die Gaußsche Normalverteilungsfunktion wäre vordefiniert noch schön. Sie wird doch ab und an benötigt.

Ich wollte für meine persönlichen Zwecke Dein Programm mit einer Funktion zum Abspeichern der Rechnung als Text versehen, scheidere aber an der Komponente TreeNT, die mein altes Delphi 5 nicht mag. Vielleicht könnte ein weiterer kleiner Schalter alle Berechnungen und Ergebnisse als txt speichern oder kopieren.
Außerdem bekomme ich in jeder Quelltextzeile die Meldung: Zeile zu lang (Mehr als 1023 Zeichen), kann also ohnehin nicht compilieren.

Vor einiger Zeit hattest Du geschrieben:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Meinst du, es gibt Leute die ein Handbuch lesen würden? :D

Ja, ich! Und da ist mir aufgefallen, dass mein Internet Explorer 8 die Umlaute Deines HTML-Textes sehr merkwürdig darstellt.
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ein komplettes CAS fällt da natürlich aus ;)

Schade! Ich suche schon lange jemanden, der ein CAS in Delphi umsetzt. :wink:

Unabhängig von meinen kleinen "Meckereien" kann ich nur sagen: Pi gefällt mir. :zustimm:
Wenn es kein Geheimnis ist: Könntest Du verraten, wieso das Programm "Pi" heißt? Ich bin immer davon fasziniert, welche Beweggründe zur Namensgebung eines Programms führen.

Beste Grüße
Mathematiker


Martok - Sa 20.10.12 19:20

Moin!

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Ich wollte für meine persönlichen Zwecke Dein Programm mit einer Funktion zum Abspeichern der Rechnung als Text versehen, scheidere aber an der Komponente TreeNT, die mein altes Delphi 5 nicht mag.
Aber die richtige Version hast du? Es gibt eine für D3-5 und eine für D6 aufwärts.
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem bekomme ich in jeder Quelltextzeile die Meldung: Zeile zu lang (Mehr als 1023 Zeichen), kann also ohnehin nicht compilieren.:
Git richtig installiert? Ich glaube, die Fehlermeldung kommt, wenn die Dateien nur LF als Dateiende verwenden statt CRLF. Im Notfall alle in einem Texteditor öffnen und neu speichern.


user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Meinst du, es gibt Leute die ein Handbuch lesen würden? :D
Ja, ich! Und da ist mir aufgefallen, dass mein Internet Explorer 8 die Umlaute Deines HTML-Textes sehr merkwürdig darstellt.
Ja, der IE ignoriert die Zeichensatzangabe für UTF-8 im XML-Kopf. Ich hab mal ein <meta> ergänzt.

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht könnte ein weiterer kleiner Schalter alle Berechnungen und Ergebnisse als txt speichern oder kopieren.
Also kopieren kannt du schon, das ist ein normales RichEdit. Kommt also ganz gewöhnliches RTF raus.
Wobei du damit wieder das ansprichst, was mich am Meisten stört... die Ein/Ausgabe. Allein, dass das zwei Controls sind (man also hin und her tabben kann) ist schon doof - das haben CASse schon richtig. Ich hab da immer mal mit Protected im RichEdit oder auch HTMLViewer experimentiert, aber so richtig zufriedenstellend war das alles nicht. Im Richedit ist auch die Eingabe-History etwas schwierig einzubinden. Mit Pfeiltasten geht grad noch, aber ein Dropdown ist da echt ein Problem.
Müsste man also eigentlich ein eigenes Control schreiben (da könnte man dann auch z.B. Diagramme als eingebettete Controls realisieren, das wäre dann gleich interaktiv), aber dafür dann Textselektion und sowas zu bauen... ne, das wollte ich mir noch nicht antun.
Wenn du natürlich mal Langeweile hast.... :P :zwinker:


user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Die Gaußsche Normalverteilungsfunktion wäre vordefiniert noch schön. Sie wird doch ab und an benötigt.
Als verteilter Zufall (dann wäre mindestens Poisson auch mal noch wichtig) oder als Statistik auf Listen (also Stddev)? Letzteres ist nämlich einfach in Pi selbst programmiert, aber da ich "Lade Skript aus Datei" bis heute nicht von der Todo-Liste abgearbeitet hab, muss man sich den Ausdruck merken ;)

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es kein Geheimnis ist: Könntest Du verraten, wieso das Programm "Pi" heißt? Ich bin immer davon fasziniert, welche Beweggründe zur Namensgebung eines Programms führen.
Eine sehr gute Frage :zustimm:

Ich glaube, einen richtigen "Grund" gabs da gar nicht. Ich hatte etwas gesucht, was ich auf's Icon malen könnte. Und irgendwie ist pi ja schon das erste Symbol, was einem so zu Mathematik einfällt. Hat vielleicht auch damit zu tun, dass es die erste vordefinierte Konstante war :gruebel:.

Übrigens, wer das mal braucht, hab die Behandlung grade im Divisions-Code wiedergefunden: \Infty = 1/0, \NegInfty = -1/0, NAN = 0/0


Mathematiker - Sa 20.10.12 19:54

Hallo Martok,
vielen Dank für die Hinweise.
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Aber die richtige Version hast du? Es gibt eine für D3-5 und eine für D6 aufwärts.

Natürlich hatte ich die falsche. Jetzt funktoniert es.
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab mal ein <meta> ergänzt.

Wunderbar. Das Handbuch wird jetzt im Internet Explorer korrekt angezeigt.
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Müsste man also eigentlich ein eigenes Control schreiben (da könnte man dann auch z.B. Diagramme als eingebettete Controls realisieren, das wäre dann gleich interaktiv), aber dafür dann Textselektion und sowas zu bauen... ne, das wollte ich mir noch nicht antun.
Wenn du natürlich mal Langeweile hast.... :P :zwinker:

Langeweile habe ich selten, aber was wichtiger ist, ich wüsste gar nicht, wie ich das anstellen soll. Es wird wohl nichts werden. :nixweiss:

Beste Grüße
Mathematiker


Martok - Mi 24.10.12 01:26

Hi,

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Natürlich hatte ich die falsche. Jetzt funktoniert es.
Kaum macht man's richtig, schon gehts :zustimm:

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Langeweile habe ich selten, aber was wichtiger ist, ich wüsste gar nicht, wie ich das anstellen soll. Es wird wohl nichts werden. :nixweiss:
Och schade ;)
Was aber wirklich mal interessant (und weit weniger speziell) wäre: das Graphing-Zeugs "in schön". Ich hab da im Git schonmal etwas umgeräumt, aber die Skalierung z.B. haut ja noch nicht so wirklich stabil hin. Ich brauch das grade selber öfter, da ist mir das aufgefallen wie schlecht das eigentlich alles ist ;) Zoomen können wäre wirklich schön, aber so wird das nix.
ListPlots (die eigentlich eher XYPlots sind) sollte man vielleicht auch von Histogrammen trennen. Das würde ein paar Sachen erleichtern...

Vorschläge nehm ich da gerne entgegen. Gerne auch in Codeform :zwinker:

Grüße,


Mathematiker - Mi 24.10.12 16:43

Hallo Martok,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
... das Graphing-Zeugs "in schön". Ich hab da im Git schonmal etwas umgeräumt, aber die Skalierung z.B. haut ja noch nicht so wirklich stabil hin. ... Zoomen können wäre wirklich schön, aber so wird das nix.

Bisher habe ich in "Pi" nur die Grafik für die Funktionen getestet. Sieht doch ganz gut aus. :)

Ich werde unter Open Source Projekte ein kleines Programm mit spezieller Unit veröffentlichen, mit der man schnell und einfach mathematische Standardfunktionen zeichnen kann, auch mit Zoom des Darstellungsintervalls und ein paar anderen Möglichkeiten.
Ich vermute, dass dies Dir nicht helfen wird, aber vielleicht nützt es anderen.

Beste Grüße
Mathematiker


Martok - Sa 03.11.12 20:48

Mit tatkräftigerideengebender Hilfe von user profile iconFinnO und einem "joar, den Vorschlag hatte ich auch schon getippt und dann wieder aus dem Chat gelöscht" von user profile iconHidden gibt's jetzt schöne Diagramme, und damit eine neue Version. In den dazugekommenen Features ist eindeutig eine Tendenz, was daran liegt, dass ich aktuell Pi zur Auswertung der Messergebnisse für meine BA verwende.

Änderungen:

Neu: ordentliche Diagramme!

Beispielgraph (png, 44.53 KB)
sineder

Was an dem zu beachten ist: der blaue Sinus stammt aus einer Funktion, die Ableitungen Cos und -Sin sind per numderive aus einer Wertetabelle erzeugt worden. Bei -Sin sieht man auch schön, wie das mit den Ableitungen läuft: vor dem ersten Schritt sind einfach keine Daten vorhanden ;). Der absolute Fehler der 2. Ableitung gegen die Funktion -sin(x) ist übrigens irgendwo in der Größenordnung von 1E-4.


Downloadlink wie immer im ersten Beitrag.


PS: 111 Commits im Repository :D


Martok - So 11.11.12 19:39

Wie bereits öfter angedroht, hab ich mich mal hingesetzt und eine kurze Dokumentation zum Codeaufbau geschrieben.
Das ganze findet sich hier [https://github.com/martok/pi/wiki/Hacking-Guide], ich werde den Link auch im ersten Beitrag noch ergänzen.

Ich hoffe mal, ich hab nicht allzu viel vergessen ;-)


Mathematiker - So 11.11.12 20:47

Hallo Martok,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Wie bereits öfter angedroht, hab ich mich mal hingesetzt und eine kurze Dokumentation zum Codeaufbau geschrieben.

Danke. Ich habe intensiv Deinen Text gelesen und kann nur staunen. Ich verstehe nämlich überhaupt nichts. :nixweiss: Z.B.
Zitat:
Implementiert ist das ganze über Interfaces, um Referenzzählung zu bekommen. Dieses Interface wird dann von Klassen implementiert, die in der Konstante Expressions definiert sind.

Du musst mir das aber hier nicht erklären. Es wäre verlorene Mühe. Bis ich soweit bin, dass zu verstehen, dauert es noch sehr sehr lange.
Was macht das Termzusammenfassen? :wink: Ich habe gepasst.

Beste Grüße
Mathematiker


Martok - So 11.11.12 20:53

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Implementiert ist das ganze über Interfaces, um Referenzzählung zu bekommen. Dieses Interface wird dann von Klassen implementiert, die in der Konstante Expressions definiert sind.

Du musst mir das aber hier nicht erklären.
Das verstehst du, wenn du meinen aus Zeitmangel unveröffentlichten Artikel über Interfaces gelesen hast... :oops:

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Was macht das Termzusammenfassen? :wink: Ich habe gepasst.
Ich baue grade noch Panning für die Diagramme. Für den Rest warte ich auf user profile iconjaenicke :P


FinnO - So 11.11.12 21:26

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Das verstehst du, wenn du meinen aus Zeitmangel unveröffentlichten Artikel über Interfaces gelesen hast...


Also... wenigstens in Auszügen verstehst du das dann :)

LG!


Martok - Mi 13.02.13 21:22

Ich darf Verkünden: es ist nix passiert :lol:
Doch, eins: Github hat die Downloads abgeschafft, das heißt: die aktuellste Binary gibts jeweils nur noch im ersten Beitrag als Anhang. Schade.

Als "Zwischenstand" gibt's jetzt die Version 6, mit folgenden Änderungen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
add: Panning in Graphs, fix some UI stuff
add: graph tool 'read value'
add: Step(), Sign()
chg: replace TreeNT with standard TTreeView
add: directly save EMF from Graph display
add: GCD(), LCM(), Fraction()
fix: extreme zoom in graphs
add: basic statistics with Gaussians (Package Statistics)

Für Details verweise ich auf die Dokumentation.

Was ich als nächstes mache, ist noch nicht klar. Eventuell passiert hier auch noch länger nix, aber dieses Release war erstmal überfällig.


Martok - Sa 29.06.13 00:00

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Was ich als nächstes mache, ist noch nicht klar. Eventuell passiert hier auch noch länger nix, aber dieses Release war erstmal überfällig.
Ich bin ziemlich gut darin, (In-)Aktivität vorherzusagen :rofl:

In den letzten 2 Wochen habe ich mich damit befasst, die komplette innere Struktur neu zu entwickeln. Da das ja mindestens doppelt so gut werden sollte, passiert das ganze in einem Entwicklungszweig namens "tau" [https://github.com/martok/pi/commits/tau], und einiges hat sich da schon getan.
Relativ offensichtlich am Anfang ist eine striktere Trennung des Rechenkernels von der Oberfläche und von seinen Funtionspackages. Das macht es einfacher, den Kernel (ich suche übrigens noch einen schönen Codenamen, sowas haben die doch alle :lol:) in anderen Projekten zu verwenden. Unter Anderem gibt es jetzt eine Kommandozeilenversion tau.exe (logischerweise ohne die Graphing-Funktionen), die allerdings eher zum Testen des neuen Codes diente und vermutlich nicht wirklich weiterentwickelt werden wird. Wird sich zeigen.

Wichtiger ist allerdings die erwähnte neue Struktur, die (unter Verwendung von Dingen die ich in den letzten Jahren beim Lesen diverser Paper und Blogbeiträge der Entwickler von MuPAD und Mathematica gelernt habe) jetzt komplett auf einer möglichst geringen Anzahl verschiedener Elemente basiert. So gibt es jetzt nur noch 4 Typen von Expressions (genannt Primitiven):

Sämtliche Operatoren werden über Zuordnungstabellen auf Funktionen abgebildet. So ist z.b. der Ausdruck 1+2+3+4 identisch zu _plus(1,2,3,4). Diverse Optionen stellen dabei sicher, dass nur sinnvolle Aufrufe gebildet werden können. Dies passiert direkt beim Parsen der Ausdrücke nach der Zerlegung in Tokens (der einzige Teil, der gleich geblieben ist), so dass danach der komplette Ausdruck in einen Baum von diesen 4 Primitiven überführt ist oder eventuelle Fehler bereits erkannt wurden.

Da jetzt symbolische Referenzen ein echtes Ausdruckselement sind, ist es auch einfacher, symbolische Aktionen zu entwickeln (nun ja, wie "einfach" das halt sein kann) und bei der Gelegenheit ist auch die Unterscheidung zwischen := / _define() und = / _assign() nachvollziehbarer geworden. Zusammen mit hold() bedeutet das, dass jetzt Ausdrücke an sich transportiert werden können, ohne eine ungewollte Auswertung zu "riskieren".

Auch neu (bzw. aktuell Work-in-Progress) ist (realisiert über einen Datentyp für das Primitive Objekt "Wert", so wie String oder Liste auch) das Rechnen mit phyiskalischen Einheiten/Dimensionen (Hände hoch: wer hier weiß, auf welch' abenteuerliche Art das °C definiert ist?). Noch funktioniert das nur sehr rudimentär und die komplette Algebra ignoriert Einheiten vollständig, allerdings sollten zumindest die Grundrechenarten recht einfach brauchbar umsetzbar sein. Auch Konstanten können dann in ihren echten Einheiten definiert werden (Elementarladung = 1.602e-19 C) bzw. werden direkt überflüssig (Lichtjahr, Parsec...).

Neu auf der TODO-Liste ist eine sinnvollere Dokumentation der Funktionen, am Besten in einem standardisierten Format im Quellcode selbst. PasDoc ist hier der offensichtliche Ansatz, ist allerdings nur schwierig anpassbar. Wird also wohl auf eine Eigenentwicklung hinauslaufen. Eine Einbindung in das Programm (Code Hint) wäre natürlich optimal, allerdings habe ich noch keine Ahnung wie ;-)

Binaries vom aktuellen Stand gibt es erstmal nur im Anhang dieses Beitrags (oder zum selbstcompilieren im Git, es werden keine Extrakomponenten mehr benötigt), da das Ganze kein Release ist sondern ich nur auf ein wenig Feedback hoffe. Die Dokumentation ist nicht aktuell, allerdings sollte sich nicht viel geändert haben. Auch das ist Teil des Tests :roll: Undokumentiere Funktionen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
clone(expr)
  erzeugt eine Kopie der Expression
subs(expr, {var:=newexpr,var2=newVal})
  wendet die Definitionen(Zuweisungen) in der Liste auf expr an. expr wird evaluiert, also ggf. in hold() verpacken
unit(value,'unitspec')
  erzeugt eine Zahl mit Dimension
convert(unitval, 'unitspec')
  rechnet eine Zahl von einer Einheit in eine andere um, sofern das möglich ist


Oh und: am 9.7. wird Pi 2 Jahre alt :party:
Wer also vorher noch das "Ich war dabei"-Zertifikat haben will: Patches, GitHub-Pull-Requests oder auch Blobs of Code sind immer gern gesehen und werden passend vercredited ;-)

[/WallOfText]


Martok - Fr 16.08.13 06:52

Moin!

Es ist mal wieder soweit, die "Periode Größerer Aktivität" neigt sich dem Ende zu, es gibt also ein Release ;)

Was sich intern getan hat, steht im Beitrag hier drüber. Die Kommandozeilenversion liefere ich tatsächlich mit aus, aber wirlich gefplegt würde ich die nicht nennen. Ist auch nicht dokumentiert, verhält sich aber nicht weiter unerwartet für jemand der vor 20 Jahren schon Computer hatte :lol:

Das mit den Namen ist jetzt so: der Kernel heißt Tau, die GUI heißt weiterhin Pi. Minimale Umgewöhnung und so :P Genau deswegen hab ich mich auch gegen die Versionsnummer Tau entschieden und so folgt auf V6 tatsächlich ganz gewöhnlich V7. Solche Spielereien rächen sich spätestens nach 5-6 Versionen, TeX demonstriert das ja sehr schön.

Dinge, die sonst noch so passiert sind:
- Massive Beschleunigung von Funktionsaufrufen, merkt man gerade bei Diagrammen
- Binomialkoeffizient (n über k) und Anzahl geordneter Permutationen n Pk
- Einheitenhandling (das meines Wissens besser ist als alles was große CASse ab Werk bieten, Mathematica9 kommt über das WolframAlpha-Interface ran, aber das wars auch :roll: )
- Timing: AbsoluteTime
- Trunc, Ceil, Floor
- Anfänge von symbolischer Manipulation: Subst
- Erweiterung der Selbsttests
- Fixes rund um fiese Eingeschaften von Extended

Als bessere Todo-Liste verwende ich jetzt die Github-Issues [https://github.com/martok/pi/issues] (Link auch im ersten Beitrag), wer mag, kann da gerne Dinge reinwerfen. Da kann man auch Pull-Requests anhängen :P

Der Hacking Guide ist noch nicht aktualisiert, der neue Code sollte sich allerdings wesentlich einfacher lesen lassen. Er ist jedenfalls kürzer - im Endeffekt ist sogar die Binary 40kb kleiner geworden, obwohl sie jetzt viel mehr kann. Mal sehen wann ich das mache - hat feedbackbedingt eher geringe Priorität.


Downloads im ersten Beitrag.

Oh und: There May Be Bugs ;)


Martok - Do 17.10.13 16:31

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Der Hacking Guide ist noch nicht aktualisiert, der neue Code sollte sich allerdings wesentlich einfacher lesen lassen.
Bin grade dabei [https://github.com/martok/pi/wiki/Hacking-Guide]. Ist grade in einem etwas seltsamen Zustand des "nicht-ganz-richtig-seins", aber die Struktur stimmt schon wieder.
Ich wär euch sehr verbunden, wenn ihr mal so in den Raum werft, wo die größten Fragezeichen auf der Stirn erscheinen. Packages ist soweit klar, aber das ist jetzt auch etwas einfacher geworden.


Martok - So 06.07.14 21:12

Es gibt mal wieder was Neues:



Außerdem ein massiver Rewrite des Ausdrucksbaums; Operatoren sind jetzt Aliase für Funktionen. Das macht sehr vieles intern einfacher. Wer sehen will, was das genau bedeutet bekommt von ?() und ??() jetzt dazu passende ExpressionTree-Infos.
Auch das Einheiten/Datentypen-Handling ist neu. Zahlen sind nicht mehr immer Extended sondern können auch Int64 sein (und bleiben das auch, wenn die Funktion das beachtet). Das macht bestimmte ganzzahlarithmetische Dinge wesentlich einfacher.

Neuer Download ist im ersten Beitrag. Neuer Screenshot auch, wer mir sagen kann was ich dort berechne kriegt einen Keks (Selbstabholer) :zwinker:


Mathematiker - So 06.07.14 21:47

Hallo,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
... wer mir sagen kann was ich dort berechne kriegt einen Keks (Selbstabholer) :zwinker:

Zuerst den Umfang der Erdbahn (Astronomische Einheit * 2pi) und anschließend die mittlere Bahngeschwindigkeit der Erde auf Ihrer Umlaufbahn.
Wo ist mein Keks? :lol:

Beste Grüße
Mathematiker

Nachtrag: Diff funktioniert irgendwie nicht. Ich bekomme die Meldung
Zitat:
EFOpenError: Datei ...\rules_diff.pi kann nicht geöffnet werden. Das System kann die angegebene Datei nicht finden

Was mache ich falsch?


Martok - So 06.07.14 23:25

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Zuerst den Umfang der Erdbahn (Astronomische Einheit * 2pi) und anschließend die mittlere Bahngeschwindigkeit der Erde auf Ihrer Umlaufbahn.
Korrekt :zustimm:
Wobei ich mir nicht sicher bin, ob da ein julianisches Jahr richtig war. War es?

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Wo ist mein Keks? :lol:
Komm halt vorbei und hol ihn dir :D Alternativ hätten wir hier auch einen user profile iconTeekeks :mrgreen:

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Nachtrag: Diff funktioniert irgendwie nicht. Was mache ich falsch?
Nix, die Datei fehlt im Archiv. Das funktioniert eh nicht wirklich :roll:
Prinzipiell findest du die hier [https://github.com/martok/pi/blob/master/bin/rules_diff.pi], aber der Patternmatcher kann noch keine Constraints (einer der Gründe warum dieses Release so lange rumlag; hatte es jetzt dach gemacht, da der Rest schon ganz nett ist), das wird also nicht laufen.


Mathematiker - So 06.07.14 23:33

Hallo,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Wobei ich mir nicht sicher bin, ob da ein julianisches Jahr richtig war. War es?

Die "Genauigkeit" Deiner Rechnung gibt sogar die Pikometer je Sekunde an. Da sollte es schon das tropische Jahr sein, also

Quelltext
1:
2:
Meeus 1994: Tropisches Jahr = 365,24219879 d - 0,00000614 · T; Zunahme um 5,36 Sekunden je Jahrtausend
T … Zeit in julianischen Jahrhunderten von je 36525 Ephemeriden Tagen seit 1900, Januar 0.5
:mrgreen:

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Komm halt vorbei und hol ihn dir :D

Im Herbst bin ich eine Woche in Quedlinburg. Ballenstedt ist nicht so weit. :wink:

Beste Grüße
Mathematiker


Stundenplan - Mo 07.07.14 11:51

Irgendwo geistert noch ein DivByZero-Bug herum; der Selftest bricht nämlich mit dieser Exception ab.
Hier mal der Log:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
.....
 Begin: Arithmetic Operations
    Begin: Numeric
      Begin: Add
        Success
        Success
        Success
        Success
      Begin: Sub
        Success
        Success
        Success
        Success
        Success
        Success
      Begin: Mul
        Success
        Success
      Begin: Div
  //hier knallts


Martok - Mo 07.07.14 16:14

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Komm halt vorbei und hol ihn dir :D

Im Herbst bin ich eine Woche in Quedlinburg. Ballenstedt ist nicht so weit. :wink:
Oh, na da mach ich mir doch mal einen Knoten in den Kalender :)

user profile iconStundenplan hat folgendes geschrieben Zum zitierten Posting springen:
Irgendwo geistert noch ein DivByZero-Bug herum; der Selftest bricht nämlich mit dieser Exception ab.
Oh, stimmt. Wenn man schon 1/0=INF etc. implementiert, sollte man das auch für alle Datentypen tun. Habs gefixt, mal gucken ob das nächste Release wieder ein Jahr dauert :P


Martok - Fr 29.05.15 20:06

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
mal gucken ob das nächste Release wieder ein Jahr dauert :P
*hüstel*

Mal so in den Raum gefragt: benutzt das Ding jemand? Ich hätte da nämlich mal eine Konzeptfrage.
Aktuell ist das Ziel immer noch der 1-Datei-Minimalmodus, alle externen Dateien (Dokumentation, Rulesets) sind optional. Das macht aber einige Dinge sehr unhandlich... Ließe sich einfach umgehen, indem man eine normale Verzeichnisstruktur draus macht. Die würde ich immer noch gerne portabel haben, aber bevor ich da jetzt irgendwem den Usecase wegschieße, frag ich lieber ;)


Mathematiker - Fr 29.05.15 23:56

Hallo,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Mal so in den Raum gefragt: benutzt das Ding jemand?

Ja, ich! :zustimm:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Die würde ich immer noch gerne portabel haben, aber bevor ich da jetzt irgendwem den Usecase wegschieße, frag ich lieber ;)

Ich sehe da kein Problem

Beste Grüße
Mathematiker


Martok - Fr 22.01.16 02:04

Fast Pi/2 Jahre rum, man könnte mal wieder ein Release machen, oder? :lol:

V9 ist raus, mit vielen Änderungen:



Eine "Neat Application" (wie Wolfram in der Doku immer schreibt) ist jetzt z.B. das folgende Skript, welches 10 Perioden einer Sinusfunktion als Lookup-Datei generiert, wie man sie dann in einen Arbitrary Function Generator der SDG200x-Reihe von Siglent laden kann (warum man das braucht könnt ihr selber googlen, ist etwas lustig...):

Quelltext
1:
2:
3:
§wrap:= {lst} -> (merge({{'data length',count(lst)},{'xpos','values'}},lst))
§d=wrap[each(range(0,8192-1,1),x,{'',sin(x/8192*tau*10)})]
§csvsave('10sine8k.csv', d, delimiter=' ',quotechar='"')


Neuer Download ist im ersten Beitrag.

Skripte können jetzt auch mit ";" am Zeilenende geschrieben werden. Das ist semantisch allerdings etwas leicht anderes als die §-Schreibweise, da mit dieser alle Statements einzeln ausgeführt werden, als Compound allerdings alles am Stück. Die Kontext-Funktionen New() und Drop() sind davon z.B. betroffen.

Hier mal noch ein Compound-Beispiel mit Funktionen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
>  multi:= {str} -> (
  raw=ImportString(str,format='CSV');
  line=raw@0;
  each(line,r,r*3)
)
=  ({str}->((raw=ImportString(str,(format='CSV')));(line=(raw@0));each(line,r,(r*3))))

>  multi['1;2;3']
=  {3, 6, 9}


Und, so langsam habe ich ein Problem. Das RichEdit als Ausgabefenster wird immer problematischer, immer öfter laufe ich in komische Bugs, bei denen die Formatierung einfach mal explodiert. Ich tendiere aktuell zu THTMLViewer, aber das wird auch nicht so ganz trivial (da kann man nämich eigentlich nichts nachträglich einfügen). Wenn da also jemand Vorschläge hat, immer her damit ;)

Wo wir gerade bei Vorschlägen sind: logische Funktionen sind so ziemlich das nächste auf der Liste. Da stellt sich jetzt aber eine Frage: Einführen eines echten Boolean-Typs oder Matlab-artiges 1/0-geschubse mit Integern? Ich bin mir da echt nicht schlüssig, was handlicher wird.


Nersgatt - Fr 22.01.16 08:08

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
[...] welches 10 Perioden einer Sinusfunktion als Lookup-Datei generiert, wie man sie dann in einen Arbitrary Function Generator der SDG200x-Reihe von Siglent laden kann (warum man das braucht könnt ihr selber googlen, ist etwas lustig...):

Bin ich eigentlich der einzige, bei dem bei solchen Sätzen das Gehirn aussetzt und in den Pupillen nur noch "TILT" steht? :eyecrazy: :nut:


Horst_H - Sa 23.01.16 08:42

Hallo,

glaub ich Dir nicht.
Hört sich doch nur wie ein Digitalanalogwandler mit 8192 Stützstellen an, die man wohl in verschiedenen Geschwindigkeiten, eventuell sufenlos, ausgeben lassen kann.
Wenn nicht müsste ich gurgeln

Gruß Horst