Pergunta

A maioria dos matemáticos concorda que:

eni + 1 = 0

No entanto, a maioria de ponto flutuante implementações de discordar.Como bem podemos resolver essa disputa?

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

Foi útil?

Solução

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

PI é um conjunto infinito de dígitos que ninguém foi capaz de denotar por algo diferente do que uma representação simbólica, e e^X é o mesmo, e, assim, a única maneira de obter 100% de precisão é ir simbólico.

Outras dicas

Aqui está uma pequena lista de implementações e línguas que eu tentei.Ela é classificada pela proximidade a zero:

  • Regime: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i (Chez Regime, MIT Esquema)
    • 0.0+1.22460635382238e-16i (Guile)
    • 0.0+1.22464679914735e-16i (Frango com numbers ovo)
    • 0.0+1.2246467991473532e-16i (MzScheme, SISC, Gauche, Gambit)
    • 0.0+1.2246467991473533e-16i (SCM)
  • Common Lisp: (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)
  • Ruby: require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16) (RM)
    • Complex(0.0, 1.2246467991473532e-16) (JRuby)
  • R: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i

É possível resolver essa disputa?

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

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

Talvez o melhor exemplo é o sin(π) = 0?(Ou eu perdi o ponto, mais uma vez?)

Eu concordo com o Ryan, você precisará mover para outro sistema de representação.A solução está fora do reino da matemática de ponto flutuante porque você precisa ir representado como um infinitamente longo decimal, para qualquer precisão limitada esquema simplesmente não vai funcionar (pelo menos não sem o emprego de algum tipo de fudge factor de fazer até o perdido precisão).

Sua pergunta parece um pouco estranho para mim, como você parece estar sugerindo que a matemática de Ponto Flutuante é implementado pela linguagem.Que geralmente não é verdade, como o FP matemática é feita através de um ponto flutuante do processador em hardware.Mas o software ou o hardware de ponto flutuante será sempre imprecisa.O que flutua trabalho.

Se você precisa de precisão melhor que você precisar utilizar um número diferente de representação.Assim como se você estiver fazendo um número inteiro de matemática sobre números que não se encaixam em um int ou long.Alguns idiomas possuem bibliotecas para que construiu em (eu sei que o java tem BigInteger e BigDecimal), mas você teria que usar explicitamente a essas bibliotecas em vez de tipos nativos, e o seu desempenho é (às vezes de forma significativa) pior do que se você usou carros alegóricos.

@Ryan Fox

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

Nativo de tipos de dados complexos estão longe de ser desconhecido.Fortran tinha por meados da década de sessenta, e o OP apresenta uma variedade de outras linguagens que lhes dão suporte na hist acompanhamento.

E os números complexos podem ser adicionados a outros idiomas, como bibliotecas (com operador sobrecarga eles mesmo olhar apenas como tipos nativos no código).

Mas a menos que você forneça um caso especial para este problema, o "não acordo" é apenas uma expressão imprecisa máquina aritmética, 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 burro o bastante compilador)...

Eu tinha looooong café bate-papos com meu melhor amigo falando sobre números Irracionais e a diferença entre os outros números.Bem, ambas as partes concordam neste ponto de vista diferente:

Números irracionais são relações como funções, de uma forma, que forma?Bem, pense "se você quer um círculo perfeito, dá-me um perfeito pi", mas círculos são diferentes para as outras figuras (4 lados, 5, 6...100, 200), mas...Quantas mais lados você tem, mais como um círculo que se parecem.Se você me seguiu até aqui, a ligação de toda essa idéias aqui é o pi fórmula:enter image description here

Assim, pi é uma função, mas que nunca termina!devido a ∞ parâmetro, mas eu gosto de pensar que você pode ter "instância" de pi, se você alterar a ∞ parâmetro para um grande Int, você vai ter um grande pi instância.

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

Colocar todas as ideias em conjunto:

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

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

Em um idioma que não tem uma representação nativa, geralmente é adicionado usando OOP para criar um Complex classe para representar i e j, com operador sobrecarga para lidar adequadamente com as operações que envolvem outros Complex números e ou outro número primitivos nativos da língua.

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

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

Este não só afectam a equação em questão aqui, mas pode trazer instabilidade para tudo, desde a resolução de um quase-singular conjunto de equações simultâneas, através encontrar os zeros de polinˆ omios, para avaliar log(~1) ou exp(~0) (eu vi mesmo funções especiais para a avaliação de log(x+1) e (exp(x)-1) para dar a volta a isso).

Eu encorajaria que você não pense em termos de anulação da diferença-você não pode -, mas sim em fazer os respectivos cálculos de forma a garantir o mínimo de erro.

Desculpe, é que aos 43 anos desde que eu tinha este tocou em mim em uni, e mesmo se eu pudesse lembrar as referências, tenho certeza que não há melhor coisa ao redor agora.Eu sugiro que este como um ponto de partida.


Se isso soa um pouco paternalista, peço desculpa.A minha "Análise Numérica 101" foi parte do meu curso de Química, como não havia muito CS naqueles dias.Eu realmente não tenho uma noção do lugar/importância a análise numérica tem um moderno CS curso.

É uma limitação do nosso atual ponto flutuante de arquiteturas computacionais.Aritmética de ponto flutuante é apenas uma aproximação numérica pólos como e ou pi (ou qualquer coisa além da precisão de seus bits permitir).Eu realmente gosto desses números, porque eles desafiam a classificação, e parecem ter maior entropia(?) do que até mesmo primos, que são uma canônico da série.Uma relação de desafiar a representação numérica, às vezes, coisas simples, como que pode explodir a mente de uma pessoa (que eu adoro).

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

Considere uma biblioteca/linguagem que descreve os conceitos, como o e e pi em um formulário que uma máquina pode compreender.Não uma máquina de ter qualquer noção do que é um círculo perfeito é?Provavelmente não, mas podemos criar um objeto - círculo que satisfaz todos os recursos conhecidos atribuímos a ela (de raio constante, relação entre o raio da circunferência é de 2*pi*r = C).Um objeto como o pi é apenas descrito pela referida proporção.r & C podem ser objetos numéricos descritos por tudo o que precisão você deseja dar-lhes.e pode ser definida como o "o" e "é o único número real tal que o valor da derivada (inclinação da reta tangente) da função f(x) = ex no ponto x = 0 é exatamente 1" taxas.

Diversão questão.

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