Representar um número real sem perda de precisão


10

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?


12
Você só poderá representar números racionais dessa maneira.
Andrej Bauer

Como você propõe implementar operações aritméticas em números nesta representação? Usando logaritmos para mudar a base? Isso seria muito mais caro do que a matemática de ponto flutuante do IEEE.
David Zhang

Bem, eu não tenho ideia. Não sou engenheiro :) Obviamente, não posso implementá-lo em hardware. Uma implementação lenta e ineficaz pode ser feita em C. Isso seria apenas um experimento
execute

Respostas:


20

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.aba,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.


Posso fazer outra pergunta? Se você fosse um engenheiro da Intel nos anos 80, como "projetaria" seu formato de número real?
incorreto

3
Não sou muito qualificado para responder a isso, como não sou engenheiro, sou pesquisador de teoria. Não vejo muita coisa errada com os padrões flutuantes e duplos do IEEE, e agora com o quad. Eu não acho que tenha havido muitos aplicativos, dependendo da aritmética de maior precisão, e aqueles que o fazem podem usar uma versão suportada por software.
jmite

Álgebra simbólica não é o formalismo correto para a aritmética real exata. Você precisa de uma representação que permita mantissas arbitrariamente grandes.
Andrej Bauer

8
@AndrejBauer: Uma mantissa arbitrariamente grande não vai te salvar se você quiser uma representação exata de . 2
User2357112 suporta Monica

@jmite você é muito modesto :)
incud

22

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.


Pode-se restringir o requisito de representar todos os números reais e restringir apenas esses números reais, que podem ser a saída de uma máquina de turing. Isso seria apenas um número contável de números reais, mas ainda abrangeria todos os números que você desejaria representar. Mas não acho que você possa fazer cálculos eficientes com esses números.
22814 kasperd

3
@kasperd Eles são chamados reais computáveis . Infelizmente, coisas como igualdade não são computáveis ​​sobre os reais computáveis.
David Richerby

De fato, é bastante claro que calcular a igualdade nesses números equivale a resolver o problema da parada. Dada uma TM, é possível definir um número real, que começa com muitas casas decimais que são zero, exatamente o tempo de execução da TM e, em seguida, seguido por um. Comparar esse número a zero equivale a resolver o problema de parada da TM original.
kasperd

Esta resposta é falsa. Alan Turing, em seu primeiro artigo sobre máquinas, aquele em que inventa máquinas de Turing, fala sobre a representação de reais como infinitas cadeias de dados. Isso leva à idéia da chamada "máquina de Turing tipo II", e existe uma teoria bem-sucedida do cálculo de números reais com base na idéia. Também é implementado na prática, veja minha resposta.
Andrej Bauer

11
Talvez isso funcione tecnicamente, mas erra o ponto, que é que existem representações infinitas perfeitamente razoáveis de números reais. E isso não é nada estranho: uma conexão TCP / IP, uma chamada do Skype ou um feed de vídeo de uma câmera são exemplos de (potencialmente) quantidade infinita de dados. Não há limitação a priori de quanta informação eles podem fornecer. Há apenas uma limitação na quantidade de informações que você pode obter em um período finito de tempo.
Andrej Bauer

7

bmebme2

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.


+1, mas eu objetaria que você não pode representar uma sequência infinita por uma aproximação finita sem perder a precisão , conforme exigido pela pergunta. Claro, você pode obter a precisão que desejar - como se aproximando de uma maneira racional - mas não é exatamente isso que a pergunta está pedindo. Indiscutivelmente, isso é um problema com a pergunta, e não a resposta.
David Richerby

2
O ponto é que estamos não representando com cordas finitas. Estamos representando com cadeias infinitas , mas precisamos apenas de uma porção finita de uma cadeia infinita em cada estágio da computação. Ou, de outra forma: não perda de precisão, pois a estrutura de dados contém toda a informação, mas é claro que você não pode acessar ou processar todas as informações de uma só vez: a estrutura de dados oferece a precisão que você solicita. . O gargalo não está do lado da estrutura de dados, mas do lado do "consumidor" que deseja obter as informações.
Andrej Bauer

22=2k2 k222k1.99...

2
@ Thomas: a computação simbólica não representa números reais, mas geralmente algum subcampo dos reais, normalmente aquele gerado por funções elementares e raízes de polinômios. Esses subcampos não estão completos (fechados sob os limites das sequências de Cauchy) nem computacionalmente completos (fechados sob os limites computáveis ​​das sequências de Cauchy). Uma representação não é uma representação de reais, a menos que você possa representar todos os reais (computáveis): e os cálculos simbólicos falham nessa condição.
Andrej Bauer

11
Essas observações sobre a contagem são irrelevantes porque os reais computáveis ​​não são computáveis.
Andrej Bauer 28/11

7

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 :

Teorema 5-1. - A expressão da fração contínua de um número real é finita se e somente se o número real for racional.

Citação de Mathworld - Frações Periódicas Continuadas

... uma fração contínua é periódica se for a raiz de um polinômio quadrático.

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 é.


ππ

A representação de frações contínuas de reais foi proposta como uma implementação da aritmética real exata há um tempo atrás por J. Vuillemin. Acontece que não é muito eficiente, pois os números aumentam muito em breve e é difícil reduzir seu tamanho.
Andrej Bauer

As frações continuadas têm alguns problemas computacionais, mesmo para representar números racionais - embora possam ser comparados relativamente rapidamente usando uma variante de ordem lexicográfica, e ao mesmo tempo em que manipular uma única fração contínua seja fácil, tanto a adição (multiplicação binária) quanto a multiplicação nos CFs são operações bastante complicadas. implemento.
Steven Stadnicki

5

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:

x.x>0x22=0x33=0

ex

sin{xπ|sinx=0}sin

exeix


Alfred Tarski (1948), um método de decisão para álgebra e geometria elementares .


2

É possível representar uma classe muito grande de números chamados números algébricos exatamente, tratando-os como raízes de polinômios.

πe


eeixsincos{xR|sinx=0}

@ Pseudônimo Isso parece realmente interessante, mas acho que não tenho o conhecimento matemático para entendê-lo corretamente ... O que você quer dizer com "suficientemente próximo dos números inteiros"?
mais eixos

Vou alterar minha resposta para explicar.
Pseudônimo

1

π2


Esta resposta é falsa. Existe toda uma área da aritmética real exata que explica como representar os reais pelos computadores. A suposição de que um real deve ser representado por uma sequência finita está equivocada. Também podemos usar seqüências infinitas. Já Alan Turing escreveu sobre isso em seu primeiro artigo, aquele em que ele inventou as máquinas de Turing!
Andrej Bauer

Você pode criar um link para um artigo sobre como armazenar e manipular seqüências infinitas em um computador real, porque essa seria a resposta para o que a pergunta foi feita. Também não era seu primeiro papel, primeira publicação foi 1936, que o papel era de 1937.
lPlant

Você está certo, é o jornal de 1937. Para ver como as seqüências infinitas são manipuladas, você pode observar o protocolo TCP / IP, por exemplo. Eu nunca disse que todo o real deveria ser armazenado no computador.
Andrej Bauer

-1

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.


Esta é novamente uma resposta falsa, produzida por ignorância. Existe toda uma área da aritmética real exata que estuda como representar todos os reais por estruturas de dados adequadas.
Andrej Bauer

@AndrejBauer Então, você está sugerindo que existe uma estrutura de dados que pode representar qualquer número real? Qualquer estrutura de dados desse tipo teria que usar uma quantidade infinita incontável de bits para representar qualquer número.
121114 Alice Ryhl

11
Uma quantidade contável de bits é suficiente, em primeiro lugar, e como você não precisa de todos eles de uma só vez, nem é capaz de processá-los todos de uma vez, eles podem ser armazenados no tempo e no espaço.
Andrej Bauer

@AndrejBauer Esta resposta está correta e diz a mesma coisa que a sua, embora com muito menos informações. Você não pode representar todos os números reais em um computador. Você pode representar qualquer número real, mas não todos de uma vez. De qualquer forma, eu contestaria que você pode representar “muitos”, já que você pode representar apenas muitos em um determinado computador e quase nenhum (no sentido matemático) em um computador abstrato que é equivalente aos modelos usuais de computação (Turing equivalente à máquina).
Gilles 'SO- stop be evil'

-1

É 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/3como 1 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.


5+262=3

De fato. De fato, é provavelmente impossível efetivamente automatizar completamente com sucesso. No entanto, o resultado permanece preciso, mesmo se você não tiver usado a representação mais simples possível.
Jack Aidley
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.