Ein Rechner, der auf Vereinigungen disjunkter Intervalle rechnet
(victorpoughon.github.io)- Nimmt die Vereinigung disjunkter Intervalle als Eingabe und kann damit die vier Grundrechenarten, Funktionsaufrufe und Potenzen ausführen; interval union arithmetic lässt sich direkt im Browser berechnen
- Das Ergebnisintervall enthält garantiert die Werte, die entstehen, wenn man aus den Eingabe-Vereinigungen Werte auswählt und denselben Ausdruck über den reellen Zahlen berechnet; auch Division durch ein Intervall, das 0 enthält, kann in Form getrennter Vereinigungen verarbeitet werden
- Bei
1 / [-2, 1]ergibt sich[-∞, -0.5] U [1, +∞], und beitan([pi/3, 2*pi/3])ergibt sich[-∞, -1.732] U [1.732, +∞]; unterstützt also diskontinuierliche Ergebnisintervalle und Unendlichkeitsgrenzen - Unterstützt verschiedene Schreibweisen und Funktionen wie
[a, b],[a, b] U [c, d], verschachtelte Intervallsyntax,lo,hi,hull,log10,cos,min,max - Im Vollpräzisionsmodus werden mittels IEEE-754-Doppelpräzision und nach außen gerundet Intervalle zurückgegeben, die den tatsächlichen Wert einschließen; charakteristisch ist etwa, dass
0.1 + 0.2als[0.29999999999999993, 0.3000000000000001]angezeigt wird
Überblick
- Ein Rechner für Vereinigungen disjunkter Intervalle, der neben gewöhnlichen reellen Zahlen auch eine Implementierung von interval union arithmetic unterstützt
- Das Intervall
[a, b]steht für alle Zahlen von a bis b, und[a, b] U [c, d]bedeutet die Vereinigung voneinander getrennter Intervalle - Es handelt sich um eine Erweiterung der gewöhnlichen Intervallarithmetik, bei der auch Division durch ein Intervall, das 0 enthält, unter Erhaltung der Abgeschlossenheit berechnet werden kann
- Das Intervall
- Garantierte Enthaltungseigenschaft
- Wählt man aus den Eingabe-Vereinigungen jeweils beliebige reelle Zahlen und berechnet denselben Ausdruck über den reellen Zahlen, ist das Ergebnis garantiert in der ausgegebenen Vereinigung enthalten
- Kann Unsicherheit ausdrücken
- Beispielergebnis für
50 * (10 + [-1, 1])ist[450, 550]
- Beispielergebnis für
- Unterstützt komplexe Intervallausdrücke
- Mit dem Operator
Ulassen sich Ausdrücke wie( [5, 10] U [15, 16] ) / [10, 100]eingeben - Beispielergebnis:
[0.05, 1.6]
- Mit dem Operator
- Rechenergebnisse können selbst getrennte Vereinigungen sein
1 / [-2, 1]ergibt[-∞, -0.5] U [1, +∞]tan([pi/3, 2*pi/3])ergibt[-∞, -1.732] U [1.732, +∞]
- Im Vollpräzisionsmodus lässt sich der Rechner wie ein normaler Taschenrechner verwenden, liefert aber gleichzeitig Intervallergebnisse, die den tatsächlichen Wert einschließlich Gleitkomma-Präzisionsproblemen einschließen
- Als Beispiel wird für
0.1 + 0.2das Ergebnis[0.29999999999999993, 0.3000000000000001]gezeigt
- Als Beispiel wird für
Syntax
- Grundlegende Schreibweise unterstützt
- Intervallschreibweise
[a, b] - Beispiel:
[0.5, 0.6]
- Intervallschreibweise
- Vereinigungsschreibweise unterstützt
- Form
[a, b] U [c, d] - Beispiel:
[0, 1] U [5, 6]
- Form
- Vier Grundrechenarten und Potenzen unterstützt
- Addition
A + B, Beispiel➤ [90, 100] + [-2, 2], Ergebnis[88, 102] - Subtraktion
A - B, Beispiel➤ [14, 16] - [8, 12], Ergebnis[2, 8] - Multiplikation
A * B, Beispiel➤ [-5, 10] * [2, 4], Ergebnis[-20, 40] - Division
A / B, Beispiel➤ [2, 4] / [-1, 2], Ergebnis[-∞, -2] U [1, +∞] - Potenz
A ^ B, Beispiel➤ [2, 3] ^ [-2, 3], Ergebnis[0.1111, 27]
- Addition
- Funktionen und Konstanten unterstützt
- Funktionsaufrufe in der Form
function(...) log10([1, 10000])ergibt[0, 4]- Eingabe von Konstantennamen wird unterstützt
piergibt[3.1415926535897927, 3.1415926535897936]
- Funktionsaufrufe in der Form
- Gemischte Eingabe aus Zahlen und Intervallen möglich
- Intervalle können mit der Klammernotation wie
[1, 2]eingegeben werden - Zahlen wie
3.14werden als schmales Intervall der Breite 0, also[3.14, 3.14], interpretiert - Im Vollpräzisionsmodus gibt es dabei Detailunterschiede
1.55 + [-0.002, 0.002]ergibt[1.548, 1.552]
- Intervalle können mit der Klammernotation wie
- Verschachtelte Intervallsyntax unterstützt
[0, [0, 100]]kann eingegeben werden und ergibt[0, 100]- Dabei werden auch die inneren Zahlen, die die Intervallgrenzen definieren, selbst als Intervalle interpretiert
- In verschachtelten Intervallen wird für ein Intervall an einer Grenzposition dessen Obergrenze verwendet
- Durch dieses Design kann Arithmetik auch auf die Grenzen selbst angewendet werden
[0, cos(2*pi)]ergibt[0, 1]
Unterstützte Funktionen
- Konstanten unterstützt
inf,∞,pi,e[-inf, 0] * [-inf, 0]ergibt[0, +∞]
- Funktionen zum Extrahieren von Grenzen unterstützt
lo(A)gibt die Untergrenze zurücklo([1, 2])ergibt[1, 1]
hi(A)gibt die Obergrenze zurückhi([1, 2])ergibt[2, 2]
- Berechnung der Intervallhülle unterstützt
hull(A)umschließt eine Vereinigung als einzelnes Intervallhull([1, 2] U [99, 100])ergibt[1, 100]
- Grundlegende mathematische Funktionen unterstützt
abs(A), Beispielabs([-10, 5]), Ergebnis[0, 10]sqrt(A), Beispielsqrt([9, 49]), Ergebnis[3, 7]sqinv(A), Beispielsqinv([4, 64]), Ergebnis[-8, -2] U [2, 8]
- Logarithmus- und Exponentialfunktionen unterstützt
log(A), Beispiellog([0, 1]), Ergebnis[-∞, 0]log2(A), Beispiellog2([64, 1024]), Ergebnis[6, 10]log10(A), Beispiellog10([0.0001, 1]), Ergebnis[-4, 0]exp(A), Beispielexp([-∞, 0] U [1, 2]), Ergebnis[0, 1] U [2.718, 7.389]
- Trigonometrische und arkustrigonometrische Funktionen unterstützt
cos(A), Beispielcos([pi/3, pi]), Ergebnis[-1, 0.5]sin(A), Beispielsin([pi/6, 5*pi/6]), Ergebnis[0.5, 1]tan(A), Beispieltan([pi/3, 2*pi/3]), Ergebnis[-∞, -1.732] U [1.732, +∞]acos(A), Beispielacos([-1/2, 1/2]), Ergebnis[1.047, 2.094]asin(A), Beispielasin([0, 1]), Ergebnis[0, 1.571]atan(A), Beispielatan([-10, 2]), Ergebnis[-1.471, 1.107]
- Funktionen für Minimum und Maximum unterstützt
min(A, B), Beispielmin([1, 2], [0, 6]), Ergebnis[0, 2]max(A, B), Beispielmax([0, 10], [5, 6]), Ergebnis[5, 10]
Vollpräzisionsmodus
- Implementiert nach außen gerichtetes Runden auf IEEE-754-Doppelpräzisions-Gleitkommazahlen
- Verwendet den
number-Typ von JavaScript - Garantiert, dass das Ergebnisintervall den tatsächlichen Wert enthält, der entsteht, wenn derselbe Ausdruck über den reellen Zahlen mit unendlicher Präzision berechnet wird
- Verwendet den
- Enthält das Beispiel
0.1 + 0.20.3lässt sich in Doppelpräzisions-Gleitkommazahlen nicht exakt darstellen- Die Intervallarithmetik berechnet daher ein Intervall, das
0.3enthält
- Verhalten bei aktiviertem Vollpräzisionsmodus
- Vom Nutzer eingegebene Zahlen werden als kleinstes Intervall interpretiert, das den dem eingegebenen Dezimalausdruck nächstliegenden IEEE-754-Wert enthält, wobei beide Grenzen nicht mit diesem Wert identisch sind
- Ausgegebene Zahlen werden mit allen verfügbaren Dezimalstellen angezeigt
- Verwendet
Number.toString()
- Verhalten bei deaktiviertem Vollpräzisionsmodus
- Vom Nutzer eingegebene Zahlen werden als degeneriertes Intervall interpretiert, dessen beide Grenzen dem dem eingegebenen Dezimalausdruck nächstliegenden IEEE-754-Wert entsprechen
- Ausgegebene Zahlen werden mit höchstens 4 Nachkommastellen angezeigt
- Verwendet
Number.toPrecision()
Bugs
- Es wird erwähnt, dass im Rechner möglicherweise noch Bugs vorhanden sind
- Für Fehlermeldungen wird ein GitHub-Issue-Link bereitgestellt
Open Source
- Sowohl Interval Calculator als auch die Rechen-Engine not-so-float sind als Open Source veröffentlicht
- Enthält einen Spendenlink zu GitHub Sponsors
Zukünftige Arbeiten
- Der Vollpräzisionsmodus soll in zwei Steuerelemente aufgeteilt werden
- Eingabeinterpretation
- Anzeigepräzision
- Die Variable
anssoll hinzugefügt werden- Speicher für das Ergebnis der vorherigen Eingabe
- Ein Schnittmengen-Operator oder eine entsprechende Funktion soll hinzugefügt werden
- Die Intuitivität der Priorität des Operators
Usoll verbessert werden - Die Eingabe einer leeren Vereinigung soll unterstützt werden
1 Kommentare
Hacker-News-Kommentare
50 * (10 + [-1, 1]) = [450, 550]ganz natürlich. Wenn man darauf noch eine Union-Ebene setzt, kann man sogar Dinge wie die echte Umkehrfunktion der Quadratfunktion behandeln, und wenn man stattsqrteinmalsqinv(64)ausprobiert, merkt man schnell, wie das gemeint ist. Tatsächlich habe ich diesen Interval Calculator gebaut, um eine Implementierung von interval union arithmetic zu testen, an der ich für ein anderes Projekt gearbeitet habe, ein backwards updating spreadsheet. Die Implementierung ist not-so-float, verwandte Projekte sind bidicalc und die HN-Diskussionasin(1)auch ohne Mathematica die vollständige Menge[pi/2, pi/2] + n[2pi, 2pi]zu bekommen. Zweitens fand ich die erläuternde Formulierung zur Interpretation von vom Benutzer eingegebenen Zahlen etwas verwirrend. So wie ich es verstehe, müssten die Ausgabegrenzwerte des kleinsten Intervalls, das den Eingabewert enthält, die beiden nächstliegenden IEEE-754-Zahlen sein, die den Eingabewert einschließen. In der jetzigen Formulierung liest es sich für mich eher wieIEEE754(input)+[-epsilon, epsilon], was eine andere Bedeutung hätte]-∞, -1] U [0.5, +∞[; das dazwischen ausgeschlossene Intervall wäre dann]-1, 0.5[. So wie ich es verstanden habe, scheinen auch min und max in diesem Sinn interpretiert zu werden. Außerdem wäre eine UI-Idee praktisch: Wenn man auf eine Formel im Ergebnisbereich klickt oder tippt, könnte sie in das Eingabefeld kopiert werden1 / [-1, 2]erfährt man zum Beispiel nicht, welche Werte wie plausibel sind, und selbst wenn man eine gleichverteilte Eingabe annimmt, scheint die Ausgabe offensichtlich nicht gleichverteilt zu sein