mystère de calcul
-
jeudi 28 juin 2012 19:39
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
Toutes les réponses
-
jeudi 28 juin 2012 22:40
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
-
vendredi 29 juin 2012 07:18Modérateur
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:56
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
-
jeudi 19 juillet 2012 23:04Modérateur
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

