Por que os números de ponto flutuante são usados ​​com frequência em Ciência / Engenharia?


33

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?



47
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.
Doval

24
Para adicionar aos pontos acima mencionados, você não apenas se importa com a precisão além de um certo ponto, como também não pode obter resultados arbitrariamente precisos, porque muitas de suas entradas são quantidades medidas que possuem algum erro inerente.

2
Também é indescritível apontar que não é certo que os erros de arredondamento também continuem se acumulando. Depende do que você está fazendo e como está fazendo; existe um campo inteiro dedicado a isso.
Doval

10
O ponto flutuante não é "precisão aleatória", os erros de várias operações são previsíveis e bem conhecidos, e os erros de um algoritmo podem ser resolvidos. Se eles forem baixos o suficiente (e, em particular, se seus erros de retrocesso forem menores que as incertezas em suas variáveis ​​de entrada), você poderá ter certeza de que seus resultados são bons (ou pelo menos que quaisquer problemas com eles não são causados ​​por flutuações, erro pontual).
Hbbs #

Respostas:


77

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.


2
Boa resposta. Embora as funções subjacentes possam ser perfeitamente contínuas, o que exigiria precisão perfeita para modelar exatamente, a realidade é que tudo na ciência e na engenharia é uma aproximação. Preferimos ter aproximações decentes e úteis e realizar algo que precisão infinita, pelo qual esperaríamos eternamente que muitas operações fossem concluídas.
Jonathan Eunice

4
@ JonathanEunice Você não pode exatamente modelar a realidade. A entrada para o modelo vem de medições e você provavelmente nunca será capaz de medir as coisas com tanta precisão que um número real nativo no computador / software moderno (na época) o limitaria. Em outras palavras, você pode ter um modelo perfeito, software ou matemática, não importa. Por exemplo, calcule o volume de uma caixa. a*b*ccoisas 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.
luk32

2
@ luk32 Concordamos violentamente sobre a maioria desses pontos. Pode-se modelar alguma coisa exatamente (volume de uma esfera, por exemplo), mas nunca se pode medir exatamente. E a realidade nunca se encaixa perfeitamente em um modelo perfeito. É melhor obter valores / modelos ligeiramente imprecisos e úteis do que esperar por medições ou cálculos perfeitos - algo que sempre estará a um passo de distância.
Jonathan Eunice

2
“O cerne da questão é que a maioria dos cálculos científicos e de engenharia precisa de alta velocidade e grande alcance”. Se eu lhe der muito tempo, você ainda não poderá calcular exatamente porque os algoritmos para calcular exatamente são amplamente desconhecidos. E, antes de tudo, nem sequer podemos representar números exatamente. Este é apenas um problema que não sabemos como resolver, nem rápido nem devagar.
Michael Le Barbier Grünewald 22/10

@ MichaelGrünewald, não podemos representar números reais exatamente, mas somos capazes de resolver problemas com uma aproximação suficientemente próxima para construir estruturas com alguns metros de altura, identificar genes no DNA e encontrar um satélite com um cometa depois de dois anos no espaço. Parafraseando Randy Newman, isso pode não ser exato, mas está tudo certo. De fato, podemos representar os racionais exatamente usando bibliotecas de precisão arbitrárias (sujeitas a limitações de memória).
Charles E. Grant

30

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.


1
Uma das melhores respostas, eu a ignorei antes de escrever a minha.
Michael Le Barbier Grünewald 22/10

8
Além disso, há o fato levemente inconveniente de que você nem pode dizer se dois reais computáveis ​​são iguais.
Jörg W Mittag 22/10

1
Usar todos os reais computáveis ​​não teria problemas com comparações? Tenho certeza de que você não pode comparar reais calculáveis ​​arbitrários sem resolver o problema da parada.
kasperd

@kasperd: Eu acho que isso dependeria, de alguma forma, de quais operações alguém poderia usar no cálculo, embora eu não tenha certeza da riqueza de um conjunto de tipos de computação que possa ter e ainda garanta que quaisquer dois resultados arbitrários possam ser produzido em um número finito de operações poderia ser comparado em tempo limitado. Os tipos algébricos certamente atenderiam a esse critério, mas não sei se as funções ln (x) e exp (x) poderiam ser adicionadas e ainda o atendem.
Supercat 22/10

Você pode suportar aritmética de precisão arbitrária (somar, multiplicar, subtrair, dividir), irracionais (como √2), transcendentais conhecidos (como Pi e e), funções trigonométricas, etc., usando frações contínuas. Veja o algoritmo de Gosper em HAKMEM. Quando terminar, você pode executar uma avaliação lenta para obter uma aproximação de ponto flutuante à precisão desejada.
Paul Chernoch

14

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.


@leftaroundabout o que você quer dizer com matemática (como em matemática) não é ciência? No meu livro é.
Pieter B

2
@ PieterB: Matemática não é ciência. É filosofia. Ciência é o ato de formar uma compreensão do nosso mundo físico. Filosofia é o ato de entender como as idéias funcionam em um mundo ideal.
slebetman

Eu acho que a ciência geralmente prefere trabalhar com intervalos de confiança explícitos ao invés de números significativos.
Taemyr 22/10

@slebetman Além disso, isso não tem nada a ver com o meu argumento no meu post, se a matemática é uma ciência ou não, não posso deixar de citar: A natureza é inata em matemática e ela nos fala em matemática. Nós apenas temos que ouvir. Como a natureza é matemática, qualquer ciência que pretenda descrever a natureza é completamente dependente da matemática. É impossível enfatizar demais esse ponto, e é por isso que Carl Friedrich Gauss chamou a matemática de "a rainha das ciências".
Pieter B

Essa citação é daqui . Uma boa leitura e muito o que discutir, mas não aqui, pois, de fato, não tem nada a ver com o seu post ou com esta pergunta.
leftaroundabout

7

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.


6

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.


Ainda não li o jornal inteiro de Kahan, mas ele parece mais educado do que eu. Java poderia ter números que eram mais úteis e executados mais rapidamente do que realmente possui se tivesse adicionado um realtipo 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].
Supercat

Especifique isso floate doublesão os formatos de armazenamento e realé 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.
Supercat 21/10

2

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 de Arquimedes - o nome pedante de π - não é racional.
  • Muitas outras constantes importantes não são racionais.
  • Muitas outras constantes importantes nem são conhecidas por serem racionais ou não.
  • Para qualquer número racional diferente de zero x, o número exp (x) é irracional.
  • Declarações semelhantes são válidas para radicais, logaritmos e diversas funções importantes para os cientistas (distribuição de Gauss, CDF, funções de Bessel, funções de Euler, ...).

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.


Eu acho que essa é uma ótima resposta, mas não para essa pergunta, na medida em que não tenho certeza de que o solicitante entenderá os pontos que você está fazendo. Isso e você está sendo bastante simplista com a representação inexata de números \ Real ou \ Complex por uma representação digital finita (independentemente da largura de bit dinâmica ou estática). Tudo isso é inteiramente verdade, mas não vem ao caso. Parabéns por não citar robótica-Goldberg. :) E o teorema de Baire não faz parte da retórica usual encontrada em Programmers ou StackOverflow.
Mctylr 22/10/2014

0

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.


0

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.


0

Acho que isso pode ser respondido abordando para que tipos de aplicativo float/ doubledados 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 floats 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.

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.