Pergunta

Assim que eu sei sobre ponto flutuante de precisão (e como as coisas como 1.1 não podem ser expressos exatamente em binário) e tudo isso, mas eu estou querendo saber: como, então, não bibliotecas matemáticas relacionadas implementar precisão infinita? Em outras palavras, como você iria representar, por exemplo, 1,1 precisão em binário? Apenas uma descrição breve seria ótimo, eu posso descobrir os detalhes exatos mim. Obrigado. :)

Foi útil?

Solução

Não há bibliotecas de precisão infinita, mas existem bibliotecas de precisão arbitrária. Para mais detalhes de como essas são implementadas, ler alguns documentação : -)

Para representar 1,1 exatamente em binário, ponto flutuante não pode ser usado como você apontar corretamente. Ele pode ser representado se você armazenar a parte integral (1) como um inteiro, e a parte fracionária (0,1) como outro inteiro, e então você precisa para criar a lógica para lidar com estas estruturas. Alternativamente, pode ser armazenada como uma fracção (11/10) com tanto o denominador e numerador armazenado como números inteiros.

Outras dicas

Se você precisão infinita realmente média, existem duas opções:

  • Use alguma forma de computação preguiçoso. Então você pode pedir um número para tanta precisão quanto você gosta "depois" executar o cálculo (já que é preguiçoso ele realmente feito somente então). O inconveniente é que isso é muito ineficiente. Você pode fazer isso em uma linguagem como Haskell usando um sistema de número especial onde as representações se sobrepõem, por exemplo, base 2 com dígitos -1, 0, 1. A representação usual é inadequado, porque no exemplo 1, você precisa de precisão infinita para decidir entre a saída de 0 para 0.999 ... e 1 para 1.000 ...

  • Do computação simbolicamente. Representar inteiros, racionais, raízes, etc exatamente. Isso é necessário se você quer decidir a igualdade, mas também bastante ineficiente e limitada a casos especiais.

bibliotecas matemáticas com infinito precisão não são implementadas. Ele não pode ser feito. O número 1/3 não pode ser representada em um número finito de excepção como uma fracção pedaços. números transcendentes como pi e e não pode ser representado completamente de qualquer forma.

Por outro lado, é possível criar bibliotecas de matemática com enorme precisão. É tudo uma questão de alocação de bits suficientes para a mantissa do valor de ponto flutuante.

Existem certos algoritmos geométricos que dependem aritmética exata, por isso, se você olhar na biblioteca CGAL você vai encontrar uma variedade de tipos numéricos exatos que são "fechadas" em várias operações. Ou seja, não há nenhuma maneira de usar as operações apoiadas para produzir um resultado que não pode ser representado exatamente.

Alguns exemplos:

  • Inteiros são fechados sob adição e multiplicação.

  • Racionais são também fechado sob divisão, com exceção de um caso especial para zero. Pode ser representado como um par de números inteiros. Veja também as Funções com números racionais em GMP . por exemplo, 1,1 = 11/10, pode ser representada como (11, 10).

  • Um tipo de número que também é fechada sob a raiz quadrada.

Você também pode representar números em decimal e fazer aritmética decimal. A representação binária subjacente é, no sentido de que cada dígito é representado com um código binário. Cada dígito - se para a esquerda ou direita do ponto decimal - é tratado como um inteiro. Aritmética é então feito `` manualmente '', dígito por dígito.

Um exemplo de uma biblioteca baseada em decimal é BCMath em PHP.

Enquanto Pax é totalmente certo aqui quando estamos falando de pontos e números flutuante, eu acredito que há uma solução, mas é muito ineficiente.
Você pode usar uma corda para representar o seu número, cordas fazer precisão não perda.
Sempre que você tem um número como "0,0001" + "0.1" você iterate ambos corda e converter apenas a posição atual para um int.
Passo 1:
0 + 0 = 0 -.> Convertido para string e atribuir aos dados [0]
Passo 2:
0 + 1 = 1 -.> Convertido para string e atribuir aos dados [1]
Passo 3:
iter> "0.1" .lenght (.) -> Parar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top