Une calculatrice qui calcule sur des unions d’intervalles disjoints
(victorpoughon.github.io)- Prend en entrée une union d’intervalles disjoints et peut effectuer les quatre opérations, des appels de fonctions et même des puissances, avec calcul direct d’interval union arithmetic dans le navigateur
- L’intervalle résultat contient nécessairement la valeur obtenue si l’on évalue la même expression sur les réels avec des valeurs choisies dans l’union d’entrée, et la division par un intervalle contenant 0 peut aussi être traitée sous forme d’union disjointe
- Prise en charge des résultats en intervalles discontinus et des bornes infinies, par exemple
1 / [-2, 1]donne[-∞, -0.5] U [1, +∞]ettan([pi/3, 2*pi/3])donne[-∞, -1.732] U [1.732, +∞] - Prend en charge diverses notations et fonctions comme
[a, b],[a, b] U [c, d], la syntaxe d’intervalles imbriqués,lo,hi,hull,log10,cos,min,max - En mode précision totale, renvoie des intervalles qui englobent la valeur réelle grâce à un arrondi extérieur fondé sur IEEE 754 double précision, avec par exemple
0.1 + 0.2affiché comme[0.29999999999999993, 0.3000000000000001]
Vue d’ensemble
- Il s’agit d’une calculatrice qui travaille sur des unions d’intervalles disjoints, avec prise en charge d’interval union arithmetic en plus des réels ordinaires
- L’intervalle
[a, b]désigne tous les nombres de a à b, et[a, b] U [c, d]représente l’union de plusieurs intervalles séparés - C’est une extension de l’arithmétique d’intervalles classique, qui permet aussi de calculer la division par un intervalle contenant 0 tout en conservant la fermeture
- L’intervalle
- Garantie de propriété d’inclusion
- Si l’on choisit arbitrairement un réel dans chacune des unions d’entrée puis qu’on évalue la même expression sur les réels, le résultat est nécessairement contenu dans l’union de sortie
- Possibilité d’exprimer l’incertitude
- Exemple donné : le résultat de
50 * (10 + [-1, 1])est[450, 550]
- Exemple donné : le résultat de
- Prise en charge de calculs sur des expressions d’intervalles complexes
- On peut saisir des expressions comme
( [5, 10] U [15, 16] ) / [10, 100]avec l’opérateurU - Exemple de résultat :
[0.05, 1.6]
- On peut saisir des expressions comme
- Le résultat d’une opération peut être une union disjointe
1 / [-2, 1]donne[-∞, -0.5] U [1, +∞]tan([pi/3, 2*pi/3])donne[-∞, -1.732] U [1.732, +∞]
- En mode précision totale, elle peut être utilisée comme une calculatrice classique tout en fournissant des intervalles qui englobent la valeur réelle, y compris les problèmes de précision en virgule flottante
- Exemple :
0.1 + 0.2donne[0.29999999999999993, 0.3000000000000001]
- Exemple :
Syntaxe
- Prise en charge de la notation de base
- Prise en charge de la notation d’intervalle
[a, b] - Exemple :
[0.5, 0.6]
- Prise en charge de la notation d’intervalle
- Prise en charge de la notation d’union
- Prise en charge de la forme
[a, b] U [c, d] - Exemple :
[0, 1] U [5, 6]
- Prise en charge de la forme
- Prise en charge des quatre opérations et des puissances
- Addition
A + Bexemple➤ [90, 100] + [-2, 2]résultat[88, 102] - Soustraction
A - Bexemple➤ [14, 16] - [8, 12]résultat[2, 8] - Multiplication
A * Bexemple➤ [-5, 10] * [2, 4]résultat[-20, 40] - Division
A / Bexemple➤ [2, 4] / [-1, 2]résultat[-∞, -2] U [1, +∞] - Puissance
A ^ Bexemple➤ [2, 3] ^ [-2, 3]résultat[0.1111, 27]
- Addition
- Prise en charge des fonctions et des constantes
- Prise en charge des appels de fonction sous la forme
function(...) log10([1, 10000])donne[0, 4]- Prise en charge de la saisie des noms de constantes
pidonne[3.1415926535897927, 3.1415926535897936]
- Prise en charge des appels de fonction sous la forme
- Possibilité de mélanger nombres et intervalles en entrée
- On peut saisir un intervalle avec une syntaxe entre crochets comme
[1, 2] - Un nombre comme
3.14est interprété comme un intervalle étroit de largeur nulle[3.14, 3.14] - En mode précision totale, il existe des différences de détail à ce sujet
1.55 + [-0.002, 0.002]donne[1.548, 1.552]
- On peut saisir un intervalle avec une syntaxe entre crochets comme
- Prise en charge de la syntaxe d’intervalles imbriqués
- On peut saisir
[0, [0, 100]]et obtenir[0, 100] - Même les nombres internes qui définissent les bornes d’un intervalle sont tous interprétés comme des intervalles
- Dans un intervalle imbriqué, un intervalle placé en position de borne prend sa borne supérieure
- Cette conception permet d’appliquer de l’arithmétique aux bornes elles-mêmes
[0, cos(2*pi)]donne[0, 1]
- On peut saisir
Fonctions prises en charge
- Prise en charge des constantes
inf,∞,pi,epris en charge[-inf, 0] * [-inf, 0]donne[0, +∞]
- Prise en charge des fonctions d’extraction des bornes
lo(A)renvoie la borne inférieurelo([1, 2])donne[1, 1]
hi(A)renvoie la borne supérieurehi([1, 2])donne[2, 2]
- Prise en charge du calcul de l’enveloppe d’intervalle
hull(A)enveloppe une union dans un seul intervallehull([1, 2] U [99, 100])donne[1, 100]
- Prise en charge des fonctions mathématiques de base
abs(A)exempleabs([-10, 5])donne[0, 10]sqrt(A)exemplesqrt([9, 49])donne[3, 7]sqinv(A)exemplesqinv([4, 64])donne[-8, -2] U [2, 8]
- Prise en charge des fonctions logarithmiques et exponentielles
log(A)exemplelog([0, 1])donne[-∞, 0]log2(A)exemplelog2([64, 1024])donne[6, 10]log10(A)exemplelog10([0.0001, 1])donne[-4, 0]exp(A)exempleexp([-∞, 0] U [1, 2])donne[0, 1] U [2.718, 7.389]
- Prise en charge des fonctions trigonométriques et réciproques
cos(A)exemplecos([pi/3, pi])donne[-1, 0.5]sin(A)exemplesin([pi/6, 5*pi/6])donne[0.5, 1]tan(A)exempletan([pi/3, 2*pi/3])donne[-∞, -1.732] U [1.732, +∞]acos(A)exempleacos([-1/2, 1/2])donne[1.047, 2.094]asin(A)exempleasin([0, 1])donne[0, 1.571]atan(A)exempleatan([-10, 2])donne[-1.471, 1.107]
- Prise en charge des fonctions minimum et maximum
min(A, B)exemplemin([1, 2], [0, 6])donne[0, 2]max(A, B)exemplemax([0, 10], [5, 6])donne[5, 10]
Mode précision totale
- Implémentation d’un arrondi extérieur sur des flottants double précision IEEE 754
- Utilise le type
numberde JavaScript - L’intervalle résultat est garanti contenir la valeur réelle que donnerait le calcul de la même expression sur les réels avec une précision infinie
- Utilise le type
- Présence du cas
0.1 + 0.20.3ne peut pas être représenté exactement en flottant double précision- L’interval arithmetic effectue donc un calcul d’intervalle qui contient
0.3
- Comportement quand le mode précision totale est activé
- Les nombres saisis par l’utilisateur sont interprétés comme le plus petit intervalle qui contient la valeur IEEE 754 la plus proche de leur représentation décimale saisie, avec des bornes de part et d’autre différentes de cette valeur
- Les nombres en sortie sont affichés avec tous les chiffres décimaux disponibles
- Utilise
Number.toString()
- Comportement quand le mode précision totale est désactivé
- Les nombres saisis par l’utilisateur sont interprétés comme un intervalle dégénéré dont les deux bornes sont égales à la valeur IEEE 754 la plus proche de la représentation décimale saisie
- Les nombres en sortie sont affichés avec au maximum 4 décimales
- Utilise
Number.toPrecision()
Bugs
- Il est mentionné qu’il peut encore rester des bugs dans la calculatrice
- Un lien vers les issues GitHub est fourni pour signaler les problèmes
Open source
- Interval Calculator et son moteur de calcul not-so-float sont tous deux publiés en open source
- Inclut un lien de soutien GitHub Sponsors
Travaux à venir
- Le mode précision totale sera scindé en deux contrôles distincts
- Interprétation des entrées
- Précision d’affichage
- Ajout prévu de la variable
ans- Variable stockant le résultat de la saisie précédente
- Ajout prévu d’un opérateur ou d’une fonction d’intersection
- Amélioration prévue de l’intuitivité de la priorité de l’opérateur
U - Prise en charge prévue de la saisie d’une union vide
1 commentaires
Commentaires sur Hacker News
50 * (10 + [-1, 1]) = [450, 550]. En ajoutant par-dessus une couche d’unions, on peut aussi traiter de vraies fonctions inverses comme celle du carré, et on le sent bien en essayantsqinv(64)plutôt quesqrt. En réalité, ce calculateur d’intervalles a été créé pour tester une implémentation d’arithmétique sur unions d’intervalles que je développais pour un autre projet, un tableur à mise à jour rétroactive. L’implémentation est not-so-float, et les projets liés sont bidicalc ainsi que la discussion HNasin(1), l’ensemble complet[pi/2, pi/2] + n[2pi, 2pi]sans avoir besoin de Mathematica. Ensuite, la phrase expliquant l’interprétation des nombres saisis par l’utilisateur m’a semblé un peu ambiguë. Pour moi, les bornes de sortie du plus petit intervalle contenant la valeur d’entrée devraient être les deux nombres IEEE 754 les plus proches qui encadrent cette valeur, alors qu’avec la formulation actuelle j’ai l’impression de lire quelque chose commeIEEE754(input)+[-epsilon, epsilon], ce qui me semble différent]-∞, -1] U [0.5, +∞[et l’intervalle exclu au milieu serait]-1, 0.5[. Si j’ai bien compris, min et max semblent aussi s’interpréter ainsi ici. Et une idée d’UI pratique serait de pouvoir cliquer ou toucher une formule dans la zone de résultat pour la recopier dans le champ de saisie1 / [-1, 2]n’indique pas quelle valeur est la plus plausible, et même si on suppose une distribution uniforme en entrée, la sortie n’a clairement pas l’air de suivre une distribution uniforme