Desafio - problema com ponto flutuante

by agnaldo 7. agosto 2009 08:25

Existe um comportamento dos números double que é velho conhecido nosso... Em meus treinamentos de java isso aparecia de quando em quando... Nos de C# era mais raro mas também acontecia de alguém reparar.

A resposta padrão é:

isso é um comportamento da linguagem... aceite...

Mas agora temos que desvendar isso.

Para demonstrar, podemos fazer um programinha assim, em C#:

    
    class Doubles
    {
        static void Main(string[] args)
        {
            double x = 0;
        
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(x += 0.1); 
            }
            
            Console.ReadKey();
        }
    }

Ou assim, em VB.Net:

    
    Module Module1
 
        Sub Main()
            Dim x As Double = 0
 
 
            For index As Integer = 1 To 100
                x += 0.1
                Console.WriteLine(x)
            Next
 
            Console.ReadKey()
        End Sub
 
    End Module

Nada de mais... a gente imagina que vai imprimir 0.1 na primeira linha, 0.2 na seguinte e por aí vai... Claaaaaro... QUE NÃO!!!

Nada disso... Olhem mais no final da saída:

 
0,1
0,2
0,3
0,4
-------------------------
cortei aqui para publicar
-------------------------
5,7
5,8
5,9
5,99999999999999
6,09999999999999
6,19999999999999
6,29999999999999
-------------------------
cortei aqui também
-------------------------
9,79999999999998
9,89999999999998
9,99999999999998

A pergunta é: por que isso acontece?

Escrevam o que pode ser nos comentários deste post. Semana que vem eu faço outro explicando esse comportamento.

E, para que não falem que isso é problema da Microsoft, do .Net, etc, vai abaixo um código em java que tem o mesmo comportamento:

    public class Doubles {         
  
       public static void main(String[] args) {
            double x = 0;

 
           for (int i = 0; i < 10; i++) {
                System.out.println(x += 0.1);
            }

        }

    }

A saída do programa acima é:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999


Voucher com desconto para provas Microsoft

by agnaldo 6. agosto 2009 20:27

Fala, gente, blz?

A partir de agora, por tempo indeterminado, vou liberar (semanalmente) dois vouchers para provas de certificação Microsoft.

O desconto dado é de 10% (dez por cento).

Valem algumas observações:

  • o voucher só vale para a primeira pessoa que se registrar para a prova na Prometric;
  • não vale para provas de Dynamics;
  • só vale para provas realizadas no Brasil;
  • não é cumulativo.

Até a próxima semana e, quem passar em alguma prova, me conte. Aí eu divulgo aqui no blog, se quiser.

 



O blog foi citado no Jornal Destak

by agnaldo 5. agosto 2009 20:04

Obrigado ao jornal Destak pela citação na edição 633, de 19/fevereiro/2009. Recebi do Rodrigo Zeni, do blog Fila de espera o link para a edição eletrônica.

Esse post estava no blog antigo, mas resolvi publicar novamente.



Agnaldo

foto

Veja meu perfil em http://about.me/agnaldo

Month List