59 Punkte von GN⁺ 2025-02-17 | 12 Kommentare | Auf WhatsApp teilen

„Eine Rechner-App? So etwas kann doch jeder bauen“ → stimmt in Wirklichkeit nicht

  • Ein Rechner muss das Ergebnis mathematischer Ausdrücke exakt anzeigen, und das ist viel schwieriger, als man denkt
  • Im iOS-Rechner wird (10^100) + 1 − (10^100) fälschlicherweise als 0 berechnet
  • Android zeigt dagegen korrekt 1 an, aber wie das umgesetzt wurde, ist wirklich unglaublich

Google und Hans-J. Boehm

  • Google stellte den bekannten Programmierer Hans-J. Boehm ein
  • Boehm ist ein Experte, der die Semantik gemeinsamer Variablen in C++ definiert hat
  • Doch die Aufgabe, die ihm gegeben wurde, war unerwartet: die Entwicklung einer Rechner-App

Das Problem mit Gleitkommazahlen

  • Gleitkommazahlen können Werte wie 0.3 oder 10^100 nicht exakt darstellen
  • Das heißt, ein auf Gleitkommazahlen basierender Rechner ist nicht vertrauenswürdig
  • Für exakte Berechnungen ist daher ein anderer Ansatz nötig

Die Lösung mit Bignum

  • Das Problem bei Ganzzahlberechnungen lässt sich mit Bignum (Ganzzahlen beliebiger Größe) lösen
  • Bignum ist ein Integer-Typ, der sich je nach verfügbarem Speicher dynamisch erweitert
  • Das Problem (10^100) + 1 - (10^100) lässt sich mit Bignum lösen
  • Bruchrechnungen bleiben damit jedoch ungelöst

Brüche und algebraische Zahlen

  • Brüche (Werte wie 3/4) lassen sich lösen, indem man Zähler und Nenner mit Bignum speichert
  • Irrationale Zahlen wie π oder √2 lassen sich damit jedoch nicht darstellen
  • Boehm versuchte es mit einer auf Polynomen basierenden Darstellung
    • Beispiel: √2 kann durch die Gleichung x² - 2 = 0 dargestellt werden
    • Aber π lässt sich auch auf diese Weise nicht darstellen

Konstruktive reelle Zahlen (Constructive Real Numbers)

  • Boehm untersuchte das Konzept der „rekursiven reellen Arithmetik (RRA)“
  • Der Nutzer gibt die gewünschte Genauigkeit an, und der Wert wird innerhalb dieser Genauigkeit berechnet
  • Beispiel: Wenn π mit einem Fehler von 0.01 dargestellt werden soll, wird 3.14 zurückgegeben
  • Dieser Ansatz erschwert jedoch exakte Vergleiche

Das Problem, exakte 0 darzustellen

  • Beim RRA-Ansatz kann 1 - 1 statt als 0 auch als 0.0000000001 dargestellt werden
  • Das ist aus Sicht der User Experience (UX) problematisch
  • Boehm begann zusammen mit anderen Forschern nach einer Lösung zu suchen

Der Richardson-Fitch-Algorithmus

  • 1994 lösten Dan Richardson und John Fitch das Problem des Zahlenvergleichs innerhalb bestimmter Operationen
  • Doch der Algorithmus ist so langsam, dass er praktisch unbrauchbar ist
  • Um zum Beispiel 1 ≠ 1 - e^(-e^1000) zu entscheiden, sind mehr Operationen nötig als es Atome im Universum gibt

Die Kombination aus RRA und rationaler Arithmetik

  • Boehm kam auf die Idee, die Vorteile von RRA und rationaler Arithmetik zu kombinieren
  • Für einfache Operationen (z. B. 6 × 9 oder 8 / 3) wird rationale Arithmetik verwendet
  • RRA wird nur dann verwendet, wenn irrationale Zahlen beteiligt sind
  • Dadurch werden Zahlen letztlich in der Form rational × reell dargestellt

Symbolische Darstellung (Symbolic Representation)

  • Spezielle Zahlen wie π oder √2 werden nicht per RRA, sondern symbolisch dargestellt
  • Beispiel: π wird als Symbol „π“ gespeichert und nur bei Bedarf in einen Zahlenwert umgewandelt
  • Nicht nur die vier Grundrechenarten, sondern auch trigonometrische Funktionen (sin, cos, tan), Logarithmen und Exponentialfunktionen nutzen symbolische Darstellung

Die endgültige Lösung

  • Alle Zahlen werden in der Form rational × reell (symbolische Darstellung oder RRA) gespeichert
  • Wo immer möglich, wird rationale Arithmetik genutzt, um die Exaktheit zu bewahren
  • Symbolische Darstellung wird maximal ausgeschöpft, um RRA-Berechnungen zu minimieren
  • Das Ergebnis ist ein perfektes Rechnersystem, das Geschwindigkeit und Genauigkeit in Balance bringt

Fazit

  • Der von Boehm und seinem Team entwickelte Android-Rechner ist kein simples Programm
  • Er liefert exakte Ergebnisse und verwendet zugleich schnelle und effiziente Algorithmen
  • Es ist nicht „einfach nur eine Rechner-App“, sondern ein mathematisch ausgefeiltes System

„Wenn du das nächste Mal den Android-Rechner benutzt, denk an diesen Aufwand!“

12 Kommentare

 
street62 2025-02-20

Nebenbei bemerkt finde ich es interessant, dass die AI neo es mit „geojana“ übersetzt hat. Im Original steht „Anyone could make that“, also ohne diesen verspielten Unterton, haha, aber es passt erstaunlich gut.

 
gurugio 2025-02-19

Als ich im Grundstudium war, gab es einen Kurs, in dem wir ein 8086-Board von Hand gelötet, einen Ziffernblock und ein Text-LCD angeschlossen und schließlich sogar einen Taschenrechner (nur mit den vier Grundrechenarten) in 8086-Assembly gebaut haben.
Ich habe das Board gebaut, die Tastatur und das LCD angeschlossen und zum Laufen gebracht, aber den Taschenrechner konnte ich nicht fertigstellen.
Damals dachte ich, ich hätte kein Talent für Software, und habe deshalb eine Stelle als Hardware-Ingenieur angenommen, aber irgendwie bin ich dann doch in der Softwareentwicklung gelandet.
Der Taschenrechner war wirklich schwierig.

 
yunsub2 2025-02-19

Das ist ein Tippfehler: 거자나 -> 거잖아. 😃

 
carnoxen 2025-02-18

Schon mal versucht, Gleitkommazahlen zu korrigieren? Das wird bestimmt knifflig, hahaha.

 
tribela 2025-02-18

Bei Rechner-Apps denke ich sofort an den Standardrechner von Windows. Wenn man 2+2*2 berechnet, kommt nicht 6, sondern 8 heraus. Es wirkt, als wäre das absichtlich so gemacht, aber ich kann das überhaupt nicht nachvollziehen. Ich erinnere mich, dass ich früher einmal die Alkoholmenge in einem Cocktail berechnet habe und dabei mehr Alkohol als die Gesamtmenge des Getränks herauskam, was mich ziemlich irritiert hat.

 
khrad 2025-02-19

Das folgt der üblichen Funktionsweise eines normalen Taschenrechners, bei dem bei jedem Drücken eines Operators der vorherige Ausdruck sofort berechnet wird. Haben Sie vielleicht nur wissenschaftliche Taschenrechner benutzt?

 
ned0909 2025-02-18

Sehe ich genauso. Ich dachte auch: Ohne Server ist ein Rechner doch super – und dann habe ich mich beim Beheben der ganzen Rechenfehler und Bugs total abgerackert.

 
aer0700 2025-02-17

„Eine Rechner-App? Kann doch jeder machen?“ → stimmt in Wirklichkeit nicht
Dafür scheint es aber unendlich viele Anwendungsmöglichkeiten zu geben, haha

„Python? Ist doch total einfach“ → stimmt in Wirklichkeit nicht

 
tsboard 2025-02-17

Das habe ich mir beim Anschauen auch gedacht. haha

„JavaScript? Total easy“ → stimmt in Wirklichkeit nicht

 
joyfui 2025-02-17

"(10^100)+1−(10^100)"
Oh, tatsächlich zeigt der iPhone-Rechner 0 an und der Android-Rechner 1.
Aber wenn man es direkt bei Google sucht, wird 0 angezeigt...

 
GN⁺ 2025-02-17
Hacker-News-Kommentare
  • Eine interessante Geschichte. Eine leistungsfähigere Methode, Zahlen darzustellen, ist die Darstellung als Kettenbrüche. Kettenbrüche können reelle Zahlen und rationale Zahlen effizient darstellen
    • Eine interessante Randnotiz: Laut einem nicht allzu alten Mathematiklehrbuch galt es als wahrscheinlich, dass es keine Algorithmen für Addition/Multiplikation von Kettenbrüchen gibt. 1972 bewies Bill Gosper jedoch, dass Kettenbrüche für Arithmetik perfekt geeignet sind
    • Ich arbeite gerade an einer Python-Bibliothek namens reals. Sie ist so entworfen, dass sie Decimal- oder Fraction-Typen ersetzen kann. Sie manipuliert Kettenbrüche mit den Techniken von Bill Gosper
  • Schade, dass der Link gekürzt wurde und deshalb nicht anklickbar ist. Hier ist der eigentliche Link zum Paper
  • Ich musste sofort lachen, als ich den Titel gelesen habe. IEEE 754 ist das Schlechteste, aber immer noch besser als alles andere. Beim ersten Blick auf das Beispiel dachte ich, es würde um Kahan-Summation oder ein vollständiges Computeralgebrasystem gehen. Von Recursive Real Arithmetic hatte ich noch nie gehört
    • Ich habe dabei einen Einblick in einen der frühen C++-Helden gewonnen. Eine gute Erinnerung daran, wie tief scheinbar einfache Dinge gehen können
  • Der Fahrpreis der NYC Subway beträgt 2,90 $. Als ich auf iOS mit PCalc den verbleibenden Wert einer MetroCard berechnet habe, bekam ich statt 0 den Wert -8.881784197E-16. Mit Apples Rechner passiert das nicht
    • Ich habe den Entwickler gefragt, und er antwortete, dass Apple eine eigene Mathematikbibliothek verwendet und man eine alternative Bibliothek finden müsse, um das zu ersetzen
  • Fast niemand hat eine wirklich vollständige Rechner-App gebaut. Gemeint ist ein vollwertiger Rechner wie der TI-89
    • Ich benutze auf Android einen TI-89-Rechneremulator. Er hat nicht einmal die Hälfte der Funktionen und funktioniert nicht besonders gut
  • Der Nachteil eines Wechsels zu RRA betrifft nicht nur die Benutzererfahrung. Wenn das Ergebnis 0.0000000... ist, kann der Rechner nicht entscheiden, ob er den Kehrwert dieser Zahl berechnen kann
    • Zum Beispiel gibt 1/(atan(1/5)-atan(1/239)-pi/4) „kann nicht berechnet werden“ aus. Wenn man 1/(atan(1/5)-atan(1/239)-pi/4+10^(-100000)) ausprobiert, wird immer noch „kann nicht berechnet werden“ ausgegeben
  • Fast keine Zahl kann als IEEE-Gleitkommazahl dargestellt werden. Die Wahrscheinlichkeit, dass eine zufällige Zahl theoretisch nicht beschreibbar ist, könnte bei ungefähr 100 % liegen
    • Manche Probleme lassen sich mit bignums vermeiden. Die momentane existenzielle Unruhe ist damit beseitigt
  • Weiß jemand, ob fortgeschrittene TI-Rechner wie der TI-92 dieses System verwendet haben? Es gab einen Modus für „rationale Zahlen“, und möglicherweise wurde dabei RRA verwendet
  • Die Verwendung von „recursive real arithmetic“ (RRA) erinnert mich an eine großartige Diskussion mit Conal Elliot. Dabei ging es um den Übergang davon, Dinge diskret darzustellen, hin zu einer kontinuierlichen Darstellung
    • Früher wurden Schriftarten zum Beispiel als Pixelblöcke dargestellt, heute versteht man sie als Linien/Vektoren. Informatik sollte nicht nur darin bestehen, aktuelle kommerzielle Werkzeuge zu lernen, sondern darin, nach Wahrheit zu suchen
  • Ich habe ein wenig mit dem Quellcode des Rechners aus dem Android Open Source Project herumgespielt. Google hat ihn zu Google Play Services verschoben, aber der alte Quellcode ist noch verfügbar
    • Er löst einige reale Probleme, und ich wünschte, das wäre in Bibliotheken verfügbar. Im vorherigen Artikel gab es eine Diskussion über einige Bibliotheken