O ponto flutuante atual (flutuante ANSI C, duplo) permite representar uma aproximação de um número real.
Existe alguma maneira de representar números reais sem erros ?
Aqui está uma ideia que tive, que é tudo menos perfeita.
Por exemplo, 1/3 é 0,33333333 ... (base 10) ou 0,01010101 ... (base 2), mas também 0,1 (base 3).
É uma boa ideia implementar essa "estrutura":
base, mantissa, exponent
então 1/3 pode ser 3 ^ -1
{[11] = base 3, [1.0] mantissa, [-1] exponent}
Alguma outra ideia?
Respostas:
Tudo depende do que você quer fazer.
Por exemplo, o que você mostra é uma ótima maneira de representar números racionais. Mas ainda não pode representar algo como ou e perfeitamente.π e
Na verdade, muitas linguagens como Haskell e Scheme tem suporte embutido para os números racionais, armazenando-os na forma ondea,bsão inteiros.umab a , b
A principal razão pela qual elas não são amplamente usadas é o desempenho. Os números de ponto flutuante são um pouco imprecisos, mas suas operações são implementadas em hardware. O sistema proposto permite maior precisão, mas requer várias etapas para implementar, em oposição a uma única operação que pode ser executada no hardware.
Sabe-se que alguns números reais são incontestáveis, como os números interrompidos . Não há algoritmo enumerando seus dígitos, ao contrário de , onde podemos calcular o n º dígito, enquanto nós esperar o tempo suficiente.π n
Se você deseja precisão real para coisas irracionais ou números transcendentais, provavelmente precisará usar algum tipo de sistema de álgebra simbólica e, em seguida, obter uma resposta final na forma simbólica, que pode ser aproximada a qualquer número de dígitos. No entanto, devido aos problemas de indecisão descritos acima, essa abordagem é necessariamente limitada. Ainda é bom para coisas como integrais aproximadas ou séries infinitas.
fonte
Não há como representar todos os números reais sem erros se cada número tiver uma representação finita. Existem incontáveis muitos números reais, mas apenas muitas seqüências finitas de 1 e 0 que você pode usar para representá-los.
fonte
Há todo um ramo da matemática computável que lida com a aritmética real exata. Muitas estruturas de dados para representar números reais exatos foram propostas: fluxos de dígitos, fluxos de contrações afins, sequências Cauchy de racionais, sequências Cauchy de racionais diádicos, cortes de Dedekind, sequências de intervalos shkrinking, etc. Existem implementações de aritmética real exata sobre essas idéias, por exemplo:
Destes, a iRRAM é a mais madura e eficiente. Marshall em um projeto experimental, enquanto o terceiro é um projeto de estudante, mas também o mais facilmente acessível. Ele tem uma introdução muito boa, explicando os problemas relacionados à computação com números reais, eu recomendo que você veja.
Deixe-me fazer uma observação. Alguém objetará que um objeto infinito não pode ser representado por um computador. Em certo sentido, isso é verdade, mas em outro não é. Nunca precisamos representar um número real inteiro , precisamos apenas de uma aproximação finitaem cada estágio da computação. Assim, precisamos apenas de uma representação que possa representar um real até qualquer precisão. É claro que, uma vez que a memória do computador está acabando, a memória do computador fica esgotada - mas isso é uma limitação do computador, não da representação em si. Essa situação não é diferente de muitas outras na programação. Por exemplo, as pessoas usam números inteiros em Python e as consideram "arbitrariamente grandes", embora, é claro, não possam exceder o tamanho da memória disponível. Às vezes, o infinito é uma aproximação útil para um número finito muito grande.
Além disso, ouço muitas vezes a alegação de que os computadores podem lidar apenas com números reais computáveis . Isso perde dois pontos importantes. Primeiro, os computadores têm acesso a dados do mundo externo, portanto também teríamos que assumir (o inverificável) suposição de que o mundo externo também é computável. Segundo, precisamos distinguir entre quais reais um computador pode calcular e quais reais ele pode representar. Por exemplo, se escolhermos fluxos de dígitos como representação de reais, é perfeitamente possível representar um real não computável: se alguém nos desse, saberíamos como representá-lo. Mas se escolhermos representar reais como partes do código fonte que calculam dígitos, não poderíamos representar reais não computáveis, obviamente.
De qualquer forma, este tópico é melhor abordado com algumas leituras adicionais.
fonte
Existem muitas implementações eficazes do Rational Number, mas uma que foi proposta muitas vezes e pode até lidar com algumas irracionais muito bem é a Fração Continuada .
Citação de frações continuadas de Darren C. Collins :
Citação de Mathworld - Frações Periódicas Continuadas
isto é, todas as raízes podem ser expressas como frações contínuas periódicas.
Há também uma fração exata exata para π que me surpreendeu até @AndrejBauer apontar que na verdade não é.
fonte
Há uma série de sugestões "reais reais" nos comentários (por exemplo, frações continuadas, transformações fracionárias lineares, etc.). O problema típico é que, embora você possa calcular respostas para uma fórmula, a igualdade geralmente é indecidível.
No entanto, se você está apenas interessado em números algébricos, está com sorte: a teoria dos campos fechados reais é completa, mínima e decidível. Isso foi comprovado por Tarski em 1948.
Mas há um problema. Você não deseja usar o algoritmo de Tarski, pois está na classe de complexidade NONELEMENTARY, que é tão impraticável quanto os algoritmos impraticáveis podem ser. Existem métodos mais recentes que reduzem a complexidade ao DEXP, que é o melhor que conhecemos atualmente.
Observe que o problema é difícil de NP porque inclui SAT. No entanto, não se sabe (ou acredita-se) estar no NP.
EDIT Vou tentar explicar isso um pouco mais.
A estrutura para entender tudo isso é um problema de decisão conhecido como Teorias do Módulo de Satisfação, ou SMT, para abreviar. Basicamente, queremos resolver o SAT para uma teoria construída sobre a lógica clássica.
Então começamos com lógica clássica de primeira ordem com um teste de igualdade. Quais símbolos de função queremos incluir e quais são seus axiomas determinam se a teoria é decidível ou não.
Existem muitas teorias interessantes expressas na estrutura SMT. Por exemplo, existem teorias de estruturas de dados (por exemplo, listas, árvores binárias etc.) que são usadas para ajudar a provar a correção dos programas e a teoria da geometria euclidiana. Mas, para nosso propósito, estamos analisando teorias de diferentes tipos de número.
A aritmética de Presburger é a teoria dos números naturais com adição. Essa teoria é decidível.
Aritmética Peano é a teoria dos números naturais com adição e multiplicação. Essa teoria não é decidível, como comprovado por Gödel.
A aritmética de Tarski é a teoria dos números reais com todas as operações de campo (adição, subtração, multiplicação e divisão). Curiosamente, essa teoria é decidível. Esse foi um resultado altamente contra-intuitivo na época. Você pode supor que, como é um "superconjunto" dos números naturais, é "mais difícil", mas esse não é o caso; compare programação linear sobre os racionais com programação linear sobre os números inteiros, por exemplo.
Pode não parecer óbvio que a satisfação é tudo que você precisa, mas é. Por exemplo, se você quiser testar se a raiz quadrada positiva de 2 é igual à raiz real do cubo de 3, você pode expressar isso como o problema de satisfação:
Alfred Tarski (1948), um método de decisão para álgebra e geometria elementares .
fonte
É possível representar uma classe muito grande de números chamados números algébricos exatamente, tratando-os como raízes de polinômios.
fonte
fonte
Você não pode representar todos os números reais em um computador, mas pode representar muitos. Você pode usar frações que representariam mais números do que flutuadores. Você também pode fazer coisas mais sofisticadas, como representar números como raiz de algum polinômio, com uma aproximação que no método newtons convergirá para o número.
fonte
É possível representar qualquer número precisamente onde as entradas são representáveis, armazenando-as como uma sequência de operações, por exemplo, você armazena
1/3
como1 divided by 3
, manipulando o cancelamento de operações, você pode simplificar a próxima operação para fornecer uma resposta exata(1/3) * 3
. Isso também pode lidar com situações em que você conhece irracionais, comoπ
retê-lo em seus cálculos.No entanto, requer uma quantidade crescente de memória para cada número e - supondo que seu simplificador não seja perfeito - provavelmente exigirá uma quantidade cada vez maior para os valores nos quais você está trabalhando muito.
fonte