O Problema de números em ponto flutuante
Nas declarações de variáveis dos tipos reais (float e decimal) em aplicações C# é necessário inicializá-las com uma letra correspondente ao seu tipo, pois, caso contrário serão consideradas como double, que é o padrão para valores numéricos em ponto flutuante nessa linguagem. Para variáveis float deve ser colocado um F logo após o seu valor, e para variáveis do tipo decimal a letra m. Observe a figura 1, que mostra o trecho de um código em C#. Nesses casos, podem ocorrer erros na declaração de variáveis reais (em ponto flutuante) passíveis de correções e, dependendo da aplicação, não provoca muitos prejuízos nos resultados. Entretanto, em outros casos de aplicações práticas, erros ligados ao uso desse tipo de variáveis podem ser catastróficos ou, no mínimo, provocar resultados duvidosos.
Vamos considerar a seguinte situação bem básica da Física Clássica, em que um corpo, abandonado a uma certa altura do solo, aumenta sua velocidade de 9.80665 m/s a cada segundo na queda. O programa em console “PrExeQuedaLivre1”, codificado em C# (numa primeira versão) mostra a evolução da velocidade do corpo a cada intervalo de 0.1 segundo, cuja saída pode ser vista na figura 2.1, mostrando que de t=0.0 até t=2.0 foram executadas 20 iterações: uma a cada intervalo de tempo; entretanto, matematicamente, deveria ser 21 o número de iterações. Esse erro foi devido ao uso do tipo float nas variáveis do loop que calcula as velocidades instantâneas. Agora, observando o programa na sua segunda versão (“PrExeQuedaLivre2”), quando é utilizado o tipo decimal, o número de iterações resulta no valor correto: 21, mostrando a saída na figura 2.2. Este valor correto foi obtido porque foi utilizado o tipo decimal nas variáveis, observando a compatibilidade.
Tenho pdf do meu mais recente livro “1001 Programas Prontos Para Você Codificar Na Sua Linguagem Preferida”, e de mais outros dois:
“Curso Básico de C – Prático e Fácil” e “Curso Básico de Programação – Teoria e Prática”.
Para maiores detalhes, entre em contato: [email protected]