Um pequeno desvio no ponto flutuante (im) de precisão, a parte 1

votos
16

A maioria dos matemáticos concordam que:

e πi + 1 = 0

No entanto, a maioria das implementações de ponto flutuante discordar. Como bem podemos resolver esta questão?

Estou ansioso para ouvir sobre diferentes idiomas e implementações, e vários métodos para fazer o resultado o mais próximo possível de zero. Seja criativo!

Publicado 04/08/2008 em 07:21
fonte usuário
Em outras línguas...                            


10 respostas

votos
16

Não é que a maioria das implementações de ponto flutuante discordar, é só que eles não podem obter a precisão necessária para obter uma resposta de 100%. E a resposta correta é que eles não podem.

PI é uma série infinita de dígitos que ninguém foi capaz de denotar por outra coisa senão uma representação simbólica, e e ^ X é o mesmo, e, portanto, a única maneira de chegar a 100% de precisão é ir simbólico.

Respondeu 26/12/2008 em 21:22
fonte usuário

votos
8

Aqui está uma pequena lista de implementações e linguagens que eu tentei. É classificado por proximidade de zero:

  • esquema: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i(Esquema Chez, Esquema MIT)
    • 0.0+1.22460635382238e-16i(Guile)
    • 0.0+1.22464679914735e-16i(frango com numbersovo)
    • 0.0+1.2246467991473532e-16i(MzScheme, SISC, Gauche, a jogada)
    • 0.0+1.2246467991473533e-16i(SCM)
  • Lisp comum: (1+ (exp (complex 0 pi)))
    • #C(0.0L0 -5.0165576136843360246L-20)(CLISP)
    • #C(0.0d0 1.2246063538223773d-16)(cmucl)
    • #C(0.0d0 1.2246467991473532d-16)(SBCL)
  • Perl: use Math::Complex; Math::Complex->emake(1, pi) + 1
    • 1.22464679914735e-16i
  • Python: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j(CPython)
  • Rubi: require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16)(MRI)
    • Complex(0.0, 1.2246467991473532e-16)(JRuby)
  • R: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i
Respondeu 04/08/2008 em 07:22
fonte usuário

votos
5

É possível resolver esta questão?

Meu primeiro pensamento é olhar para uma linguagem simbólica, como de bordo . Eu não acho que isso conta como ponto flutuante embora.

Na verdade, como se representam i (ou j para os engenheiros) em uma linguagem de programação convencional?

Talvez um exemplo melhor é o pecado (π) = 0? (Ou eu perdi o ponto de novo?)

Respondeu 04/08/2008 em 07:29
fonte usuário

votos
4

Sua pergunta parece um pouco estranho para mim, como você parece estar sugerindo que a matemática de ponto flutuante é implementado pela linguagem. Isso geralmente não é verdade, como a matemática FP é feito usando um processador de ponto flutuante em hardware. Mas software ou hardware, ponto flutuante será sempre impreciso. É assim que flutua trabalho.

Se você precisa de uma melhor precisão que você precisa usar uma representação número diferente. Assim como se você está fazendo matemática inteiro em números que não se encaixam em um int ou longo. Algumas línguas têm bibliotecas para que construído em (eu sei java tem BigInteger e BigDecimal), mas você teria que usar explicitamente as bibliotecas em vez de tipos nativos, eo desempenho seria (por vezes significativamente) pior do que se você usou carros alegóricos.

Respondeu 25/08/2008 em 14:37
fonte usuário

votos
4

@ Ryan Fox

Na verdade, como se representam i (ou j para os engenheiros) em uma linguagem de programação convencional?

tipos de dados complexos nativos estão longe de ser desconhecido. Fortran tinha em meados dos anos sessenta, eo OP apresenta uma variedade de outras línguas que os apoiam na continuação hist.

E números complexos podem ser adicionados a outras línguas como bibliotecas (com sobrecarga de operador que eles sequer olhar apenas como tipos nativos no código).

Mas a menos que você fornecer um caso especial para este problema, o "não-acordo" é apenas uma expressão de aritmética máquina imprecisa, não? É como reclamar que

float r = 2/3;
float s = 3*r;
float t = s - 2;

termina com (t! = 0) (Pelo menos se você usar um compilador suficiente mudo) ...

Respondeu 25/08/2008 em 14:29
fonte usuário

votos
4

Concordo com Ryan, você precisaria para ir para outro sistema numérico representação. A solução é fora do reino da matemática ponto flutuante porque você precisa pi a representada como um infinitamente longo decimal portanto, qualquer esquema de precisão limitada simplesmente não vai funcionar (pelo menos não sem empregar algum tipo de fator fudge para compensar os perdidos precisão).

Respondeu 25/08/2008 em 02:10
fonte usuário

votos
2

Eu tive conversas de café looooong com o meu melhor amigo falando sobre números irracionais e a diferença entre outros números. Bem, nós dois concordamos neste ponto de vista diferente:

números irracionais são relações, como funções, de uma maneira, que maneira? Bem, pense sobre "se você quiser um círculo perfeito, me dê um pi perfeito", mas círculos são diferent para as outras figuras (4 lados, 5, 6 ... 100, 200), mas ... quantas mais lados fazer você tem, mais como um círculo que pareça. Se você me seguido até agora, conectando todas essas ideias aqui é a fórmula pi: digite descrição da imagem aqui

Então, pi é uma função, mas que nunca termina! por causa do parâmetro ∞, mas eu gosto de pensar que você pode ter "instância" de pi, se você alterar o parâmetro ∞ para um grande Int, você terá um exemplo muito grande pi.

Mesmo com e, dá-me um parâmetro enorme, vou dar-lhe um enorme e.

Colocar todas as idéias em conjunto:

Como temos limitações de memória, a linguagem e libs nos fornece grande instância de números irracionais, neste caso, pi e e, como resultado final, você terá muito tempo aproach para obter 0, como os exemplos fornecidos pelo @ Chris Jester-Young

Respondeu 06/05/2017 em 03:07
fonte usuário

votos
2

É uma limitação dos nossos atuais arquiteturas computacionais de ponto flutuante. Aritmética de ponto flutuante é apenas uma aproximação de pólos numéricos como e ou pi (ou qualquer coisa além da precisão seus bits permitir). Eu realmente gosto desses números porque eles desafiam a classificação, e parecem ter maior entropia (?) Do que até mesmo números primos, que são uma série canônica. representação numérica de um Defy ratio, às vezes as coisas simples, como que pode explodir a mente de uma pessoa (eu amo isso).

Felizmente linguagens e bibliotecas inteiras podem ser dedicados a funções trigonométricas de precisão, utilizando conceitos de notação (semelhantes aos descritos por Lasse V. Karlsen ).

Considere uma biblioteca / linguagem que descreve conceitos como ee pi de uma forma que uma máquina pode entender. Será que uma máquina tem alguma noção do que um círculo perfeito é? Provavelmente não, mas que pode criar um objecto - círculo que satisfaz todas as características conhecidas que atribuímos a ele (raio constante, a relação do raio de circunferência é 2 * pi * r = C). Um objecto como pi só é descrito pelo referido índice. r & C podem ser objetos numéricos descritos por qualquer precisão que você quer dar-lhes. e pode ser definido "como o e é o único número real de tal modo que o valor da derivada (declive da linha tangente) de o (x), a função F = ex no ponto x = 0 é exactamente 1" de Wikipedia .

pergunta divertido.

Respondeu 20/11/2009 em 21:37
fonte usuário

votos
2

Análise Numérica nos ensina que você não pode contar com o valor preciso de pequenas diferenças entre grandes números.

Isso não afeta apenas a equação em questão aqui, mas pode trazer instabilidade para tudo, desde a resolução de um conjunto de quase singular de equações simultâneas, através de encontrar os zeros de polinômios, para avaliar log (~ 1) ou exp (~ 0) ( Eu vi mesmo funções especiais para avaliar log (x + 1) e (exp (x) -1) para contornar isso).

Eu incentivá-lo não pensar em termos de zerar a diferença - você não pode - mas sim em fazer os cálculos associados de tal forma a garantir o erro mínimo.

Sinto muito, é 43 anos desde que eu tinha essa martelada em mim em uni, e mesmo se eu poderia lembrar as referências, eu tenho certeza que há mais coisas ao redor agora. Eu sugiro este como ponto de partida.


Se isso soa um pouco paternalista, peço desculpas. Meu "Análise Numérica 101" era parte do meu curso de Química, como não havia muito CS naqueles dias. Eu realmente não tenho uma sensação para o lugar / importância análise numérica tem em um curso de CS moderna.

Respondeu 26/12/2008 em 22:22
fonte usuário

votos
2

Na verdade, como se representam i (ou j para os engenheiros) em uma linguagem de programação convencional?

Em uma linguagem que não tem uma representação nativa, que normalmente é adicionado usando OOP para criar uma Complexclasse para representar ie j, com sobrecarga de operador para lidar adequadamente com as operações envolvendo outros Complexnúmeros e ou outras primitivas número nativas da linguagem.

Por exemplo: Complex.java , C ++ <complexo>

Respondeu 25/08/2008 em 14:48
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more