Les éléments d'un tableau sont toujours initialisés à la valeur par défaut (par ex. 0.0F pour un float).Envoyé par Bluedeep
Les éléments d'un tableau sont toujours initialisés à la valeur par défaut (par ex. 0.0F pour un float).Envoyé par Bluedeep
OK, je me suis trompé, c'est vrai pour les types values. (c'est vrai que la méthode Initialize de la classe array ne sert que pour les types ref).Envoyé par alveric
Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...
Une réponse vous a aidé ? utiliser le bouton
"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Pas toujours. Les calculs flottants ne sont pas de la magie noire, c'est quelque chose de très précis. C'est juste que peu de gens savent vraiment comment ça marche (note: je ne prétend pas tout connaître à ce sujet, loin de là)... Il faut dire que le manque de doc à ce sujet sur le net n'aide pas. Parmi les rares ressources qui ne sont pas bourrées d'erreurs, lire Ce que tout informaticien devrait savoir sur l'arithmétique en virgule flottante, de David Goldberg (article en anglais, publié initialement dans le journal de l'Association for Computing Machinery).Envoyé par mehdi_tn
Pour en revenir au problème initial: 1,8 = 1 + 8/10 = 1 + 4/5. Or C# utilise une arithmétique binaire, et 1/5 n'est pas représentable exactement en base 2. En binaire, la partie "après la virgule" s'exprime en puissances négatives de 2: 1/2, 1/4, 1/8... Donc, "1,11001" en binaire s'écrit 1,78125 en décimal, sauf erreur de ma part. On peut même démontrer (mais ça serait un peu long) que 0,8 s'écrit en binaire 0,110011001100... C'est-à-dire son écriture est une suite infinie de la séquence "1100".
Quand on place cette valeur dans un float, on arrondit (à 23 chiffres après la virgule, si je me souviens bien), d'où une perte de précision.
2.0 et 0.0 sont représentables exactement (encore heureux !), mais 2.2 ne l'est pas non plus : 2,2 = 2+ 2/10 = 2 + 1/5. Idem, 1/5 n'est pas représentable exactement en binaire (0,00110011...)
On peut noter également que les additions causeront une perte de précision supplémentaire (ça peut se vérifier en posant le calcul. L'écriture de 0,8 et celle de 0,2 étant données, c'est rapide).
Comme on voit, le calcul en virgule flottante n'est sûrement pas adapté à ton problème. C'est quelque chose de complexe, qui est très utile dans certaines situations (pour peu qu'on sache ce qu'on fait), mais les problèmes d'arrondi sur des valeurs décimales fait qu'il est complètement inadapté aux calculs financiers et à tous les domaines où on ne manipule que des valeurs décimales en entrée (i.e. pas de fractions comme 1/3, pas de nombre d'or...).
Pour ces domaines, il est nécessaire d'utiliser des types de données décimaux. Suivant le langage, la solution est différente. Dans le cas du C# / .net, tu as directement le type decimal qui répond à ton besoin. Regarde la doc pour confirmer si sa précision et son amplitude encadrent le domaine de valeurs que tu dois manipuler.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager