Ao investigar a precisão dos números de ponto flutuante, vi em alguns lugares uma declaração semelhante a
" float e double são ( projetados para / usados frequentemente em ) engenharia e cálculo científico "
Pelo meu entendimento, a força dos carros alegóricos e duplos é a quantidade de memória que eles usam para sua precisão (boa, mas não perfeita).
Sinto que estou quase entendendo essa resposta
"números de ponto flutuante permitem modelar quantidades contínuas"
Ainda não estou convencido de que entendi. Engenharia e Ciência soam como campos em que você deseja resultados precisos de seus cálculos, os quais, a meu ver, pontos flutuantes não dão. Também não tenho certeza se sigo exatamente o que é uma "quantidade contínua".
Alguém pode expandir essa explicação e talvez dar um exemplo?
fonte
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.
Tanto na ciência quanto na engenharia, você se preocupa apenas com a precisão até um certo ponto. O uso de precisão infinita para todos os cálculos costuma ser desnecessariamente caro. O que diferencia o ponto flutuante do ponto fixo é que você não precisa se comprometer com um determinado número de casas decimais - você pode ter quantidades realmente pequenas com muitas casas decimais ou quantidades realmente grandes com precisão limitada.Respostas:
A computação em ciência e engenharia exige compromissos em precisão, alcance e velocidade. A aritmética de ponto fixo fornece precisão e velocidade decente, mas sacrifica o alcance. BigNum, bibliotecas de precisão arbitrárias, ganham no alcance e na precisão, mas perdem na velocidade.
O cerne da questão é que a maioria dos cálculos científicos e de engenharia precisa de alta velocidade e enorme alcance, mas possui necessidades relativamente modestas de precisão. A constante física mais bem determinada é conhecida por apenas 13 dígitos e muitos valores são conhecidos com muito menos certeza. Ter mais de 13 dígitos de precisão no computador não vai ajudar nisso. A mosca na pomada é que seqüências de operações de ponto flutuante podem gradualmente perder a precisão. O pão e a manteiga da análise numérica estão descobrindo quais problemas são particularmente suscetíveis a isso e maneiras inteligentes de reorganizar a sequência de operações para reduzir o problema.
Uma exceção a isso é a teoria dos números na matemática, que precisa executar operações aritméticas em números com milhões de dígitos, mas com precisão absoluta. Os teóricos dos números numéricos costumam usar as bibliotecas BigNum e aguentam seus cálculos demorando muito tempo.
fonte
a*b*c
coisas fáceis, no entanto, você precisa medir as dimensões que você não pode fazer com certeza absoluta; portanto, você realmente não precisa de precisão infinita de cálculo, apenas o suficiente para ficar preso a um erro de medição.Que alternativa você propõe?
Quantidades contínuas são representadas usando números reais em matemática. Não há tipo de dados que possa codificar todos os números reais possíveis (porque os reais são incontáveis), o que significa que podemos escolher apenas um subconjunto desses números reais nos quais estamos mais interessados.
Você pode escolher todos os reais computáveis, o que é semelhante ao que os sistemas de álgebra computacional (CAS) fazem. O problema é que ele se torna rapidamente inviável à medida que sua árvore de expressões cresce cada vez mais. Também é muito lento: tente resolver simbolicamente um enorme sistema de equações diferenciais no Mathematica e compare com alguma outra implementação baseada em ponto flutuante e você verá uma diferença dramática na velocidade. Além disso, como Jörg W Mittag e kasperd apontaram: você nem tem operações de igualdade / comparação decidíveis.
Você pode usar números racionais exatos, mas isso realmente não funciona para muitas aplicações, porque você precisa calcular raízes quadradas ou co-senos ou logaritmos etc. e tempo para processar à medida que você executa mais e mais cálculos sobre eles.
Você também pode usar decimais de precisão arbitrária, mas mesmo algo simples como divisão não funcionará porque você obtém dígitos repetidamente infinitos. Você também pode se deparar com a questão de aumentar a complexidade à medida que executa mais semelhante aos números racionais, embora em menor grau.
Então você seria forçado a usar aproximações em algum momento; nesse caso, é exatamente onde os números de ponto flutuante se saem melhor. Os números de ponto flutuante também têm largura fixa (diferente dos outros três tipos de dados mencionados anteriormente), o que evita o aumento da complexidade à medida que você executa cada vez mais cálculos neles.
fonte
Sua proposta sobre ciência está errada, Engenharia e Ciência, exceto Matemática, não funcionam com resultados exatos e precisos. Eles trabalham com um fator de precisão que é incorporado a quantos dígitos você mostra.
O termo-chave que você precisa entender aqui é: números significativos . Os números significativos de um número são aqueles dígitos que carregam significado, contribuindo para sua precisão.
O que basicamente significa que, se afirmo que algo tem 12 centímetros de comprimento, ele pode ter algo entre 11,5 e 12,5 centímetros de comprimento. Se, no entanto, eu afirmar que algo tem 12,00 centímetros de comprimento, pode ter algo entre 11,995 e 12,005 centímetros de comprimento.
Apenas como ilustração, se você pegar uma fita métrica e medir sua sala de estar. Embora você ache que tem 6 metros e 25 centímetros de largura, você sabe que a sua medição de fita não foi precisa o suficiente para dizer algo sobre a precisão milimétrica ou nanométrica.
fonte
Observe que os números de ponto flutuante são basicamente os mesmos da notação científica e de engenharia , a maneira padrão para os humanos escreverem números em matemática e ciências. Nesses campos, não há grande necessidade de extrema precisão, mas muitas vezes há uma enorme variedade.
Para escolher um exemplo aleatório da minha lição de física, recentemente tive que trabalhar com a massa de um elétron, que é de aproximadamente 9,11 * 10 ^ -31 kg. Eu não me importo muito com a precisão; poderia ser facilmente 9,12 para tudo o que me interessa. Mas eu me preocupo com o expoente e não quero escrever 0,0000 ... 911 kg, então uso notação científica.
Raciocínio semelhante se aplica à computação científica e de engenharia: há uma variedade enorme, mas não queremos armazenar e trabalhar com números muito grandes; portanto, armazenamos um valor normalizado e um expoente, menor e mais rápido de trabalhar.
fonte
Os números de ponto flutuante também têm várias propriedades que se prestam bem ao cálculo de certos tipos de resultados científicos. Mais notavelmente, a precisão é inversamente proporcional à magnitude, assim como na notação científica, para que você possa representar pequenas diferenças próximas de zero e diferenças maiores muito mais distantes.
O artigo de Goldberg é provavelmente a análise mais famosa das propriedades dos números de ponto flutuante (e deve ser uma leitura obrigatória se você se importa com esse tipo de coisa), mas acho que os trabalhos de Kahan explicam melhor a lógica por trás de muitos dos argumentos sutis. questões de design.
Em particular, a discussão de Kahan sobre a implementação de ponto flutuante por Java , apesar de bastante inflamatória, faz vários pontos positivos sobre por que a semântica do IEEE-754 é útil, e o Bit de Sinal de Muito Barulho por Nada explora a lógica do zero assinado com profundidade considerável.
fonte
real
tipo que levaria três entradas de pilha para armazenar e representaria a precisão computacional natural da máquina; o valor pode ser armazenado como float de 80 bits + preenchimento de 16 bits, float de 64 bits + preenchimento de 32 bits ou mantissa de 64 bits, expoente de 16 bits e 16 bits para sinal e sinalizadores [para implementações que não são de FPU].float
edouble
são os formatos de armazenamento ereal
é o formato computacional. Em muitos sistemas sem FPU, trabalhar com uma mantissa, expoente e sinalizadores que estão nos limites de palavra e meia palavra seria mais rápido do que descompactar e reembalar dobras a cada operação.TL; DR Não sabemos como calcular a maioria das funções com precisão perfeita; portanto, não faz sentido representar números com precisão perfeita.
Até agora, todas as respostas perdem o ponto mais importante: não podemos calcular os valores exatos da maioria dos números. Como um caso especial importante, não podemos calcular valores exatos da função exponencial - para citar apenas a função irracional mais importante.
Resposta ingênua à pergunta ingênua
Parece que sua pergunta é bastante "existem bibliotecas aritméticas exatas, por que não as usamos no lugar da aritmética de ponto flutuante?" A resposta é que a aritmética exata funciona com números racionais e que:
O número racional é um acidente de sorte. A maioria dos números não é racional (veja o teorema de Baire); portanto, calcular números sempre nos tirará do mundo racional.
O que é computar e representar um número?
Podemos reagir dizendo: “OK, o problema é que os números racionais não eram uma ótima escolha para representar números reais.” Depois, enrolamos nossa bifurcação no Debian e desenvolvemos um novo sistema de representação para números reais.
Se queremos calcular números, temos que escolher um sistema de representação para números reais e descrever operações importantes neles - ou seja, definir o que significa computação . Como estamos interessados em computação científica, queremos representar com precisão todos os números decimais (nossas medidas), seus quocientes (números racionais), valores das funções exponenciais e algumas constantes engraçadas, como o número de Arquimedes.
O problema é que a única maneira de representar perfeitamente os números nesse sistema é usar a forma simbólica, ou seja, não computar nada e trabalhar com expressões algébricas. Esta é uma representação bastante prejudicada de números reais, porque não podemos comparar com segurança dois números (qual é o maior)? Não podemos nem mesmo responder facilmente à pergunta "O número fornecido é igual a 0?".
Se você procura definições e problemas matemáticos mais precisos, procure números racionais, números transcendentais, melhores aproximações e o teorema de Baire, por exemplo.
fonte
Porque
1) Os autores assumem que "o cálculo científico e de engenharia" mede quantidades físicas do mundo real
2) As quantidades físicas são contínuas e, exatamente como você declara "números de ponto flutuante, permite modelar quantidades contínuas"
.. e o resto da minha resposta é resumida muito bem por Rufflewind , então não vou repetir isso aqui.
fonte
Os números de ponto flutuante fornecem precisão relativa: eles podem representar números que estão no máximo em uma pequena porcentagem (se você quiser chamar algo como 0,0000000000001001% a porcentagem) de qualquer número preciso em uma ampla variedade de números. Eles compartilham essa característica com uma regra de slide, embora a última não melhore do que algo como três dígitos de precisão. Ainda assim, foi suficiente para elaborar as forças estáticas e dinâmicas de grandes estruturas antes que os computadores digitais se tornassem comuns para isso, e isso ocorre porque as constantes materiais também mostram alguma variação, e escolher construções que sejam razoavelmente benignas contra diferenças de material e construção tenderá a para tornar as cargas máximas e pontos fracos razoavelmente identificáveis.
Agora, "precisão" é um recurso útil para muitos números que representam medições e / ou magnitudes de propriedades físicas.
Nem tudo na ciência / engenharia pertence a essa categoria. Por exemplo, se você estiver usando transformações teóricas dos números para multiplicar números grandes ou campos de Galois para manipular polinômios de correção de erros, não haverá erro pequeno: qualquer erro de bit único durante o processamento levará a resultados que são completamente indistinguíveis de completamente aleatórios barulho.
Mesmo nessas áreas, é possível trabalhar com números de ponto flutuante (como o uso de FFTs complexas para a convolução), se acompanhar o acúmulo de erros e garantir que os erros do ponto flutuante não acumulem magnitude suficiente para, possivelmente, girar um único bit. as entidades reais das quais são aproximações. Para essas aproximações, o processamento de ponto fixo provavelmente seria mais apropriado, mas as unidades de ponto flutuante no campo tendem a fornecer operação mais rápida e um número maior de bits utilizáveis.
Também linguagens de programação como C ou Fortran tornam surpreendentemente difícil acessar operações básicas como multiplicação e divisão de precisão mista ou um bit de transporte para adição / subtração, e esses são blocos de construção básicos para ir além de números inteiros de precisão limitados.
Portanto, se você pode mapear operações para números de ponto flutuante, costuma ter hardware razoavelmente poderoso à sua disposição hoje em dia e pode razoavelmente bem especificar seus algoritmos em uma das linguagens de programação de uso geral de hoje.
fonte
Acho que isso pode ser respondido abordando para que tipos de aplicativo
float
/double
dados não são adequados.Quando você precisa ter certeza de que pode representar um número com precisão com um número específico de dígitos, os números de ponto flutuante são inapropriados, porque representam os números como potências de 2, em vez de potências de 10, como é a forma como representamos números em o mundo real.
Portanto, um domínio em que os tipos de dados de ponto flutuante não devem ser usados é o de finanças *. Para o sistema principal de, por exemplo, um banco, seria completamente inaceitável se um valor que deveria ter sido US $ 100000,01 de repente se torne US $ 100000,00 ou US $ 100000,02.
Esse problema pode ocorrer facilmente ao usar carros alegóricos, especialmente se o número for o resultado de um ou mais cálculos, por exemplo, calcular a soma de todas as transações em uma conta.
Engenharia e cálculo científico são domínios em que esses erros de arredondamento relativamente pequenos são aceitáveis. Os usuários normalmente sabem que todos os números têm uma precisão limitada e geralmente trabalham com vários dígitos significativos . Mas o mais importante é que eles têm uma precisão relativa bem definida, ou seja, fornecem o mesmo número de dígitos significativos, tanto para números muito grandes quanto para números muito pequenos.
* Trabalhei em um aplicativo financeiro em que
float
s foram usados para representar valores e, como conseqüência, foram introduzidos erros de arredondamento. Felizmente, esse bug específico não foi crítico, os usuários se queixaram de erros de cálculo no programa. E isso levou a um efeito diferente, muito pior: os usuários começaram a perder a fé no sistema.fonte