none
mystère de calcul RRS feed

  • Question

  • Bonjour

    Voici un code très simple (trop ?)

            Dim deb As Single = 1
            Dim pas As Single = 0.1
    
            For i As Integer = 0 To 20
                Console.WriteLine(deb.ToString)
                deb += pas
            Next
    

    et voici le résultat de son exécution :

    1
    1,1
    1,2
    1,3
    1,4
    1,5
    1,6
    1,7
    1,8
    1,9
    2
    2,1
    2,2
    2,3
    2,4
    2,5
    2,6
    2,7
    2,799999
    2,899999
    2,999999

    Plus que bizarre non ? 

    Comment améliorer les choses sachant que la valeur initiale peut être quelconque ?

    Merci


    Alain

    jeudi 28 juin 2012 19:39

Réponses

  • Bonjour,

    Le type Single n'est pas un type précis (il peut y avoir des erreurs de calcul de l'ordre de Single.Epsilon).
    Pour utiliser un type précis utilisez le type Decimal.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Marqué comme réponse AchLog vendredi 29 juin 2012 07:57
    vendredi 29 juin 2012 07:18
    Modérateur

Toutes les réponses

  • J'ai trouvé l'amélioration qui fournit un résultat correct. Voici :

            Dim deb As Single = 1
            Dim pas As Single = 0.1
    
            For i As Integer = 0 To 20
                Console.WriteLine((deb + i * pas).ToString)
            Next
    

    Mais cela n'explique pas l'erreur sur l'addition...


    Alain

    jeudi 28 juin 2012 22:40
  • Bonjour,

    Le type Single n'est pas un type précis (il peut y avoir des erreurs de calcul de l'ordre de Single.Epsilon).
    Pour utiliser un type précis utilisez le type Decimal.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Marqué comme réponse AchLog vendredi 29 juin 2012 07:57
    vendredi 29 juin 2012 07:18
    Modérateur
  • Il y a les mêmes problèmes d'imprécision avec le type Double. Mais avec Decimal, en effet ça fonctionne.

    Bizarre quand même, je ne m'attendais pas à cela...

    Merci Gilles.

    Cordialement


    Alain

    vendredi 29 juin 2012 07:56
  • Bonjour,

    Single et Double sont des flottants sur 4 et 8 octets. La représentation des nombres en flottant pose des problèmes au niveau de la précision mais offre des calculs très rapide (les processeurs savent calculer des flottant).

    Le Decimal est codé sur 16 octets et représente un nombre à précision fixe (un nombre x 10 à la puissance n). Il n'y a aucun problème de précision, mais parcontre les calculs sur ces nombres sont très lent...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    jeudi 19 juillet 2012 23:04
    Modérateur