Calculadora que opera sobre uniones de intervalos disjuntos
(victorpoughon.github.io)- Acepta como entrada la unión de intervalos disjuntos y puede realizar operaciones aritméticas básicas, llamadas a funciones e incluso potenciación, permitiendo calcular interval union arithmetic directamente en el navegador
- El intervalo resultado siempre contiene los valores obtenidos al evaluar la misma expresión sobre los números reales elegidos de la unión de entrada, y también puede manejar la división por intervalos que incluyen 0 en forma de unión disjunta
- En
1 / [-2, 1]produce[-∞, -0.5] U [1, +∞], y entan([pi/3, 2*pi/3])produce[-∞, -1.732] U [1.732, +∞], por lo que admite resultados de intervalos discontinuos y representación de límites infinitos - Soporta diversas notaciones y funciones como
[a, b],[a, b] U [c, d], sintaxis de intervalos anidados,lo,hi,hull,log10,cos,minymax - En el modo de precisión completa, devuelve intervalos que envuelven el valor real mediante redondeo hacia afuera basado en IEEE 754 de doble precisión, y destaca por mostrar
0.1 + 0.2como[0.29999999999999993, 0.3000000000000001]
Resumen
- Es una calculadora que opera sobre la unión de intervalos disjuntos y soporta la implementación de interval union arithmetic además de los números reales comunes
- El intervalo
[a, b]representa todos los números entre a y b, y[a, b] U [c, d]significa la unión de intervalos separados entre sí - Es una extensión de la aritmética de intervalos convencional y permite calcular incluso la división por intervalos que contienen 0 manteniendo la propiedad de clausura
- El intervalo
- Garantía de contención
- Si se elige arbitrariamente un número real de cada una de las uniones de entrada y se evalúa la misma expresión sobre los reales, ese resultado queda necesariamente incluido en la unión de salida
- Permite expresar incertidumbre
- Se da como ejemplo el resultado
[450, 550]para50 * (10 + [-1, 1])
- Se da como ejemplo el resultado
- Soporta el cálculo de expresiones complejas con intervalos
- Se puede introducir una expresión como
( [5, 10] U [15, 16] ) / [10, 100]usando el operadorU - Se muestra como ejemplo el resultado
[0.05, 1.6]
- Se puede introducir una expresión como
- El resultado de una operación puede ser una unión disjunta
1 / [-2, 1]da como resultado[-∞, -0.5] U [1, +∞]tan([pi/3, 2*pi/3])da como resultado[-∞, -1.732] U [1.732, +∞]
- En el modo de precisión completa puede usarse como una calculadora normal, pero además devuelve intervalos que envuelven el valor real, incluidos los problemas de precisión de punto flotante
- Se presenta el ejemplo
0.1 + 0.2con resultado[0.29999999999999993, 0.3000000000000001]
- Se presenta el ejemplo
Sintaxis
- Soporte para notación básica
- Admite la notación de intervalos
[a, b] - Ejemplo:
[0.5, 0.6]
- Admite la notación de intervalos
- Soporte para notación de unión
- Admite la forma
[a, b] U [c, d] - Ejemplo:
[0, 1] U [5, 6]
- Admite la forma
- Soporta operaciones aritméticas básicas y potenciación
- Suma
A + B, ejemplo➤ [90, 100] + [-2, 2], resultado[88, 102] - Resta
A - B, ejemplo➤ [14, 16] - [8, 12], resultado[2, 8] - Multiplicación
A * B, ejemplo➤ [-5, 10] * [2, 4], resultado[-20, 40] - División
A / B, ejemplo➤ [2, 4] / [-1, 2], resultado[-∞, -2] U [1, +∞] - Potenciación
A ^ B, ejemplo➤ [2, 3] ^ [-2, 3], resultado[0.1111, 27]
- Suma
- Soporte para funciones y constantes
- Admite llamadas a función en la forma
function(...) log10([1, 10000])da como resultado[0, 4]- Admite introducir nombres de constantes
pida como resultado[3.1415926535897927, 3.1415926535897936]
- Admite llamadas a función en la forma
- Se pueden mezclar números e intervalos en la entrada
- Se pueden introducir intervalos con la sintaxis de corchetes, como
[1, 2] - Un número como
3.14se interpreta como un intervalo estrecho de ancho 0,[3.14, 3.14] - En el modo de precisión completa hay diferencias de detalle relacionadas con esto
1.55 + [-0.002, 0.002]da como resultado[1.548, 1.552]
- Se pueden introducir intervalos con la sintaxis de corchetes, como
- Soporta sintaxis de intervalos anidados
- Se puede introducir
[0, [0, 100]]y el resultado es[0, 100] - Incluso los números internos que definen los límites del intervalo se interpretan todos como intervalos
- En los intervalos anidados, un intervalo colocado en una posición de límite toma el límite superior de ese intervalo
- Este diseño permite aplicar aritmética al propio límite
[0, cos(2*pi)]da como resultado[0, 1]
- Se puede introducir
Funciones compatibles
- Soporte para constantes
- Soporta
inf,∞,piye [-inf, 0] * [-inf, 0]da como resultado[0, +∞]
- Soporta
- Soporte para funciones de extracción de límites
lo(A)devuelve el límite inferiorlo([1, 2])da como resultado[1, 1]
hi(A)devuelve el límite superiorhi([1, 2])da como resultado[2, 2]
- Soporte para cálculo de envolvente de intervalo
hull(A)envuelve la unión en un solo intervalohull([1, 2] U [99, 100])da como resultado[1, 100]
- Soporte para funciones matemáticas básicas
abs(A), ejemploabs([-10, 5]), resultado[0, 10]sqrt(A), ejemplosqrt([9, 49]), resultado[3, 7]sqinv(A), ejemplosqinv([4, 64]), resultado[-8, -2] U [2, 8]
- Soporte para funciones logarítmicas y exponenciales
log(A), ejemplolog([0, 1]), resultado[-∞, 0]log2(A), ejemplolog2([64, 1024]), resultado[6, 10]log10(A), ejemplolog10([0.0001, 1]), resultado[-4, 0]exp(A), ejemploexp([-∞, 0] U [1, 2]), resultado[0, 1] U [2.718, 7.389]
- Soporte para funciones trigonométricas e inversas trigonométricas
cos(A), ejemplocos([pi/3, pi]), resultado[-1, 0.5]sin(A), ejemplosin([pi/6, 5*pi/6]), resultado[0.5, 1]tan(A), ejemplotan([pi/3, 2*pi/3]), resultado[-∞, -1.732] U [1.732, +∞]acos(A), ejemploacos([-1/2, 1/2]), resultado[1.047, 2.094]asin(A), ejemploasin([0, 1]), resultado[0, 1.571]atan(A), ejemploatan([-10, 2]), resultado[-1.471, 1.107]
- Soporte para funciones de mínimo y máximo
min(A, B), ejemplomin([1, 2], [0, 6]), resultado[0, 2]max(A, B), ejemplomax([0, 10], [5, 6]), resultado[5, 10]
Modo de precisión completa
- Implementa redondeo hacia afuera sobre punto flotante IEEE 754 de doble precisión
- Usa el tipo
numberde JavaScript - Garantiza que el intervalo resultado siempre contiene el valor real de calcular la misma expresión sobre los reales con precisión infinita
- Usa el tipo
- Incluye el caso de
0.1 + 0.20.3no puede representarse exactamente como punto flotante de doble precisión- La aritmética de intervalos calcula un intervalo que contiene
0.3
- Comportamiento al activar el modo de precisión completa
- Los números introducidos por el usuario se interpretan como el intervalo más pequeño que contiene el valor IEEE 754 más cercano a la representación decimal escrita, pero cuyos dos límites no son iguales a ese valor
- Los números de salida se muestran con todos los dígitos decimales disponibles
- Usa
Number.toString()
- Comportamiento al desactivar el modo de precisión completa
- Los números introducidos por el usuario se interpretan como un intervalo degenerado cuyos dos límites son iguales al valor IEEE 754 más cercano a la representación decimal escrita
- Los números de salida se muestran con un máximo de 4 decimales
- Usa
Number.toPrecision()
Errores
- Se menciona que es posible que aún queden errores en la calculadora
- Se proporciona un enlace de GitHub Issues como vía para reportar problemas
Código abierto
- Tanto Interval Calculator como el motor de cálculo not-so-float están publicados como código abierto
- Incluye un enlace de patrocinio en GitHub Sponsors
Trabajo futuro
- Está previsto dividir el modo de precisión completa en dos controles
- Interpretación de entrada
- Precisión de visualización
- Está previsto añadir la variable
ans- Variable para guardar el resultado de la entrada anterior
- Está previsto añadir un operador o función de intersección
- Está previsto mejorar la intuición de la precedencia del operador
U - Está previsto admitir la entrada de unión vacía
1 comentarios
Comentarios en Hacker News
50 * (10 + [-1, 1]) = [450, 550]. Si encima le agregas una capa de unions, también puedes manejar cosas como la verdadera inversa de la función cuadrado, y se entiende mejor si pruebassqinv(64)en lugar desqrt. En realidad, este interval calculator lo hice para probar una implementación de arithmetic de uniones de intervalos que venía desarrollando para otro proyecto, una hoja de cálculo con actualización hacia atrás. La implementación está en not-so-float, y los proyectos relacionados son bidicalc y la discusión en HN[pi/2, pi/2] + n[2pi, 2pi]paraasin(1)sin tener que recurrir a Mathematica. Segundo, la redacción sobre cómo se interpretan los números que ingresa el usuario me confundió un poco. Según entiendo, los valores límite de salida del intervalo más pequeño que contiene el valor de entrada deberían ser los dos números IEEE 754 más cercanos que lo encierran, pero tal como está escrito suena más comoIEEE754(input)+[-epsilon, epsilon], y eso se siente distinto]-∞, -1] U [0.5, +∞[; entonces el intervalo excluido del medio sería]-1, 0.5[. Por lo que entendí, min y max también parecen interpretarse de esa manera. Y otra idea de UI que sería cómoda: que al hacer clic o tocar una fórmula en el área de resultados, se copie al campo de entrada1 / [-1, 2]no te dice qué valores son más o menos plausibles, y aun suponiendo que la entrada sea uniforme, la salida claramente no parece seguir una distribución uniforme