Calculadora que calcula sobre conjuntos de intervalos separados
(victorpoughon.github.io)- Recebe como entrada a união de intervalos separados, executa as quatro operações aritméticas, chamadas de função e até potenciação, permitindo calcular interval union arithmetic diretamente no navegador
- O intervalo resultante sempre inclui os valores obtidos ao calcular a mesma expressão nos reais com valores escolhidos da união de entrada, e até a divisão por intervalos que incluem 0 pode ser tratada na forma de uniões separadas
- Em casos como
1 / [-2, 1], o resultado é[-∞, -0.5] U [1, +∞], e emtan([pi/3, 2*pi/3]),[-∞, -1.732] U [1.732, +∞], com suporte a resultados em intervalos descontínuos e representação de limites infinitos - Suporta diversas notações e funções, como
[a, b],[a, b] U [c, d], sintaxe de intervalos aninhados,lo,hi,hull,log10,cos,minemax - No modo de precisão total, retorna intervalos que envolvem o valor real com arredondamento para fora baseado em IEEE 754 de dupla precisão, destacando-se por mostrar
0.1 + 0.2como[0.29999999999999993, 0.3000000000000001]
Visão geral
- É uma calculadora voltada a uniões de intervalos separados, com suporte não só a números reais comuns, mas também à implementação de interval union arithmetic
- O intervalo
[a, b]representa todos os números de a até b, e[a, b] U [c, d]significa a união de intervalos separados entre si - É uma extensão da aritmética intervalar comum, e até a divisão por intervalos que contêm 0 pode ser calculada preservando a propriedade de fechamento
- O intervalo
- Garantia de inclusão
- Se for escolhido arbitrariamente um número real de cada união de entrada e a mesma expressão for calculada sobre os reais, o resultado estará necessariamente contido na união de saída
- Permite expressar incerteza
- É dado o exemplo de
50 * (10 + [-1, 1]), cujo resultado é[450, 550]
- É dado o exemplo de
- Suporta o cálculo de expressões intervalares complexas
- É possível inserir expressões como
( [5, 10] U [15, 16] ) / [10, 100]usando o operadorU - É dado o exemplo de resultado
[0.05, 1.6]
- É possível inserir expressões como
- O resultado das operações pode ser uma união separada
1 / [-2, 1]resulta em[-∞, -0.5] U [1, +∞]tan([pi/3, 2*pi/3])resulta em[-∞, -1.732] U [1.732, +∞]
- No modo de precisão total, ela pode ser usada como uma calculadora comum, mas ainda fornece resultados intervalares que envolvem o valor real, incluindo problemas de precisão de ponto flutuante
- É mostrado o exemplo de
0.1 + 0.2, cujo resultado é[0.29999999999999993, 0.3000000000000001]
- É mostrado o exemplo de
Sintaxe
- Suporte à notação básica
- Suporta a notação de intervalo
[a, b] - Exemplo:
[0.5, 0.6]
- Suporta a notação de intervalo
- Suporte à notação de união
- Suporta a forma
[a, b] U [c, d] - Exemplo:
[0, 1] U [5, 6]
- Suporta a forma
- Suporte às quatro operações e à potenciação
- Adição
A + Bexemplo➤ [90, 100] + [-2, 2]resultado[88, 102] - Subtração
A - Bexemplo➤ [14, 16] - [8, 12]resultado[2, 8] - Multiplicação
A * Bexemplo➤ [-5, 10] * [2, 4]resultado[-20, 40] - Divisão
A / Bexemplo➤ [2, 4] / [-1, 2]resultado[-∞, -2] U [1, +∞] - Potenciação
A ^ Bexemplo➤ [2, 3] ^ [-2, 3]resultado[0.1111, 27]
- Adição
- Suporte a funções e constantes
- Suporta chamadas no formato
function(...) log10([1, 10000])resulta em[0, 4]- Suporta inserir nomes de constantes
piresulta em[3.1415926535897927, 3.1415926535897936]
- Suporta chamadas no formato
- Entrada mista de números e intervalos
- É possível inserir intervalos com a sintaxe de colchetes, como em
[1, 2] - Números como
3.14são interpretados como um intervalo estreito de largura 0,[3.14, 3.14] - No modo de precisão total, há diferenças detalhadas relacionadas a isso
1.55 + [-0.002, 0.002]resulta em[1.548, 1.552]
- É possível inserir intervalos com a sintaxe de colchetes, como em
- Suporte à sintaxe de intervalos aninhados
- É possível inserir
[0, [0, 100]], e o resultado é[0, 100] - Até os números internos que definem os limites do intervalo são interpretados como intervalos
- Em intervalos aninhados, o intervalo colocado na posição do limite passa a usar o limite superior desse intervalo
- Esse design permite aplicar aritmética ao próprio limite
[0, cos(2*pi)]resulta em[0, 1]
- É possível inserir
Funções suportadas
- Suporte a constantes
- Suporta
inf,∞,pi,e [-inf, 0] * [-inf, 0]resulta em[0, +∞]
- Suporta
- Suporte a funções de extração de limites
lo(A)retorna o limite inferiorlo([1, 2])resulta em[1, 1]
hi(A)retorna o limite superiorhi([1, 2])resulta em[2, 2]
- Suporte ao cálculo do invólucro do intervalo
hull(A)envolve a união em um único intervalohull([1, 2] U [99, 100])resulta em[1, 100]
- Suporte a funções matemáticas básicas
abs(A)exemploabs([-10, 5])resultado[0, 10]sqrt(A)exemplosqrt([9, 49])resultado[3, 7]sqinv(A)exemplosqinv([4, 64])resultado[-8, -2] U [2, 8]
- Suporte a funções logarítmicas e exponenciais
log(A)exemplolog([0, 1])resultado[-∞, 0]log2(A)exemplolog2([64, 1024])resultado[6, 10]log10(A)exemplolog10([0.0001, 1])resultado[-4, 0]exp(A)exemploexp([-∞, 0] U [1, 2])resultado[0, 1] U [2.718, 7.389]
- Suporte a funções trigonométricas e trigonométricas inversas
cos(A)exemplocos([pi/3, pi])resultado[-1, 0.5]sin(A)exemplosin([pi/6, 5*pi/6])resultado[0.5, 1]tan(A)exemplotan([pi/3, 2*pi/3])resultado[-∞, -1.732] U [1.732, +∞]acos(A)exemploacos([-1/2, 1/2])resultado[1.047, 2.094]asin(A)exemploasin([0, 1])resultado[0, 1.571]atan(A)exemploatan([-10, 2])resultado[-1.471, 1.107]
- Suporte a funções de mínimo e máximo
min(A, B)exemplomin([1, 2], [0, 6])resultado[0, 2]max(A, B)exemplomax([0, 10], [5, 6])resultado[5, 10]
Modo de precisão total
- Implementa arredondamento para fora sobre ponto flutuante IEEE 754 de dupla precisão
- Usa o tipo
numberdo JavaScript - Garante que o intervalo resultante sempre contenha o valor real obtido ao calcular a mesma expressão sobre os reais com precisão infinita
- Usa o tipo
- Inclui o caso
0.1 + 0.20.3não pode ser representado exatamente em ponto flutuante de dupla precisão- A interval arithmetic realiza um cálculo intervalar que inclui
0.3
- Com o modo de precisão total ativado
- Os números inseridos pelo usuário são interpretados como o menor intervalo que contém o valor IEEE 754 mais próximo da representação decimal digitada, com ambos os limites diferentes desse valor
- Os números de saída são exibidos com todos os dígitos decimais disponíveis
- Usa
Number.toString()
- Com o modo de precisão total desativado
- Os números inseridos pelo usuário são interpretados como um intervalo degenerado cujos dois limites são iguais ao valor IEEE 754 mais próximo da representação decimal digitada
- Os números de saída são exibidos com no máximo 4 casas decimais
- Usa
Number.toPrecision()
Bugs
- É mencionado que ainda pode haver bugs na calculadora
- É fornecido um link de GitHub Issues como canal para relatar problemas
Código aberto
- Tanto o Interval Calculator quanto o motor da calculadora, not-so-float, são publicados como open source
- Inclui link de apoio via GitHub Sponsors
Trabalhos futuros
- O modo de precisão total será dividido em dois controles
- interpretação da entrada
- precisão de exibição
- Será adicionada a variável
ans- variável para armazenar o resultado da entrada anterior
- Será adicionado um operador ou função de interseção
- A intuitividade da precedência do operador
Userá melhorada - Haverá suporte para entrada de união vazia
1 comentários
Comentários do Hacker News
50 * (10 + [-1, 1]) = [450, 550]saem de forma natural. Quando você acrescenta uma camada de union, também dá para lidar com coisas como a verdadeira inversa da função quadrática, e isso fica claro se você testarsqinv(64)em vez desqrt. Na verdade, este interval calculator foi feito para testar uma implementação de interval union arithmetic que eu estava criando para outro projeto, a backwards updating spreadsheet. A implementação está em not-so-float, e os projetos relacionados são bidicalc e esta discussão no HN[pi/2, pi/2] + n[2pi, 2pi]paraasin(1)sem precisar do Mathematica. Segundo, a frase explicando como os números digitados pelo usuário são interpretados me pareceu um pouco confusa. Pelo que entendi, os valores-limite de saída do menor intervalo que contém o valor de entrada deveriam ser os dois números IEEE 754 mais próximos que envolvem essa entrada; mas, do jeito que está escrito, soa mais comoIEEE754(input)+[-epsilon, epsilon], o que parece ter outro significado]-∞, -1] U [0.5, +∞[; aí o intervalo excluído no meio seria]-1, 0.5[. Pelo que entendi, min e max também parecem ser interpretados dessa forma. E uma ideia de UI que talvez fosse útil seria poder clicar ou tocar a expressão na área de resultado para copiá-la para o campo de entrada1 / [-1, 2]não diz quão plausíveis são os diferentes valores, e mesmo assumindo entradas uniformes, a saída claramente não parece seguir uma distribuição uniforme