Mathe-Classe/ Alternatvien und Hilfe gesucht

  • Hallo Zusammen,


    ich hab vor einiger Zeit eine App geschrieben die mein Mathematischen probleme mit dem Rechenweg löschen sollte und es auch tut.
    Nun habe ich mir mal andere Taschenrechner-Apps angeschaut und habe mir überlegt wie diese so die Aufgaben lösen und musste festellen das zu 90% alle obfokusiert sind und ich den Quellcode nicht einsehen,bzw es ist so durcheinander mir tausenden Classen geschrieben das ich nicht durchsehe.


    Nun, meine Frage.
    Kennt jemand eine OpensourceClasse die mir einen String in einen Ergebnis umwandelt?
    oder mir alternativen nennen dafür,
    alternativen wie ich rangehen könnte, denn bis jetzt habe ich mit "Matcher" und "Regex" gearbeitet und diversen "Patter" und diese dann per "switch ...case" abgefragt und ausrechnen lassen



    Wenn es denn erwüscht ist, würde ich auch meine Classe posten via. Pastbin.com (300 Zeiler) oder auch hier.

  • Eine Taschenrechnerapp ist halt keine 0815 frickelapp. Da gehört halt viel rein, von grafischer Oberfläche bis Rechenfunktionen. Sowas ist eben sehr umfangreich und bedarf komplexen codegebilden.


    Das kommt immer darauf an.
    Im Prinzip besteht so ein Taschenrechner ja (wie jedes Programm) eher aus drei Komponenten: Eingabe Verarbeitung Ausgabe.


    'Mathe–Classe' liest sich für mich so, als sei da eine schicke Implementierung für die Verarbeitungsschicht gesucht.
    Da ist es erst einmal egal, ob nachher die Eingabe und Ausgabe über das Display passieren, in einem Terminal oder es sogar komplett abgespalten ist: Eingabe via Terminal und Ausgabe auf dem Drucker oder sowas. (Einige Lagersysteme arbeiten so. Eingabe der Kommissionierung via Terminal und Ausdruck der Transportbelege, ohne dass die Ergebnisse auf dem Terminal jemals sichtbar waren.)


    Naja, und jede dieser drei Komponenten ist halt schon eine Herausforderung für sich.
    Mein Lieblingsbeispiel ist da ja der Taschenrechner von Windows, der je nach Ansicht unterschiedlich rechnet(e: zuletzt getestet unter XP…)


    Standardansicht: 2 + 2 * 2 = 8
    Wissenschaftliche Ansicht: 2 + 2 * 2 = 6


    Was ist nun richtig und warum? ;)


    Die Klasse zur Berechnung ist schnell erstellt. So viel Voodoo ist das mit der rechnenden Mathematik ja zum Glück nicht.
    (Sofern man nicht Geschichten a lá 'Gegeben sei x als Element der positiven ganzen Zahlen' implementieren will… Wusstet Ihr, dass es einen Unterschied zwischen 'positiven ganzen Zahlen' und 'nichtnegativen ganzen Zahlen' gibt? Er heißt '0'…)


    Wenn man PEMDAS befolgt, hat man das ziemlich zügig durch.
    (Reihenfolge der Rechenschritte: Klammern (Parantheses), Exponentialfunktionen, Multiplikation, Division, Addition, Subtraktion.)


    Immerhin hat die Mathematik den Vorteil, dass der ganze Computerscheiß darauf basiert. ^^


    Das wirkliche Problem ist die Umwandlung der Eingaben (hier als String) in etwas Ausrechenbares, das im Idealfall der PEMDAS Regelung folgt.
    Wie das ganz einfach möglich ist? Gar nicht.


    Ich denke, am Sinnvollsten wäre die Nutzung der durch die Mathematik vordefinierten DSL (Domain Specific Language). Dazu benötigst Du ein paar Lexer, Tokenizer, Parser und Syntaxbäume. Trivial ist anders.
    Gibts aber auch Frameworks für, wenn man sich das basteln lassen möchte.
    Beispielvortrag:
    https://macoun.de/video2013/tssa1.php


    Da wird lediglich die Kunst, die DSL so einzugeben, dass daraus generiert wird, was man gern hätte.
    Spannendes Thema. Und kompliziert. ;)


    Ein weiteres Problem sind die fies geringen Wertebereiche. So ein Integer reicht in Java von -2^31 bis 2^31-1
    Oder in Zahlen:

    Zitat

    -2.147.483.648
    2.147.483.647


    (https://docs.oracle.com/javase…pi/java/lang/Integer.html)
    2,1 Milliarden scheint jetzt nicht sooo wenig. Wenn man bedenkt, dass wir Hochrechnungen zu Folge 7,2 Milliarden Menschen auf diesem Planeten haben – tja, reicht nicht.


    Natürlich könnte man mit Double rechnen. Die haben ja einen unglaublich hohen Wertebereich.
    Geht von 2^-1074 bis (2-2^-52)·2^1023


    In Zahlen?

    Zitat

    4,9 E-324
    1,7976931348623157 E308


    Hilfreich, was? ^^ Zum Vergleich:

    Zitat

    -2.147.483.648 = -2,147483648 E9
    2.147.483.647 = 2,147483647 E9


    Also 324 Stellen hinter dem Komma bei Zahlen kleiner 1 und 308 Stellen hinter der Zahl (gegenüber 9) bei Zahlen größer 1.
    Großer, sehr sehr großer Wertebereich.
    Also immer schön Doubles nehmen? Nope.
    Die sind wirklich sehr sehr sehr ungenau.
    Es kann durchaus passieren, dass 1.000000 + 1.000000 nicht unbedingt 2.000000 ergeben müssen. Kommt immer darauf an, woher die 1.0 kommt.
    Wenn die 1.0 in Wirklichkeit eine 0.999999|583 ist, kommt plötzlich und völlig unerwartet 1.999999|166 bei rum.
    (| ist der Trenner, bei dem die Zahl bei der Ausgabe normalerweise abgeschnitten wird. 1.0 wird hier bei der Ausgabe auf 2 aufgerundet, was bei 1.9… nicht der Fall ist.)


    Du siehst also: Das sieht nur deshalb so kompliziert aus, weil es so kompliziert ist. ;)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

    4 Mal editiert, zuletzt von Marco Feltmann ()

  • Zitat von Marco Feltmann

    Das kommt immer darauf an.
    Im Prinzip besteht so ein Taschenrechner ja (wie jedes Programm) eher aus drei Komponenten: Eingabe Verarbeitung Ausgabe.

    Ich beziehe mich bei meiner Aussage auf den von mir verlinkten Code des Cyanogenmod taschenrechners und Facebamms Kommentar, dass dieser sehr komplex sei.

  • Deshalb ja auch mein Abschluss:

    Du siehst also: Das sieht nur deshalb so kompliziert aus, weil es so kompliziert ist.

    Damit stimme ich Dir also voll und ganz zu, beziehe mich nur nicht auf die verlinkte Implementierung im Speziellen sondern auf den theoretischen Ansatz im Allgemeinen. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!