IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C# 2.0] Calculs inexplicablement imprécis


Sujet :

C#

  1. #21
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par Bluedeep
    Un détail sans doute, mais il me semble que une instruction du type :

    float [] x = new float[10]

    n'initialise pas obligatoirement les membres du tableau à 0 si x est local à une méthode.
    Les éléments d'un tableau sont toujours initialisés à la valeur par défaut (par ex. 0.0F pour un float).

  2. #22
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par alveric
    Les éléments d'un tableau sont toujours initialisés à la valeur par défaut (par ex. 0.0F pour un float).
    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).

    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

  3. #23
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par mehdi_tn
    Comme il est deja mentionné, il y a toujours des erreurs de precision en travaillant avec les valeurs pointées.
    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).

    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.

Discussions similaires

  1. code imprécis calcul TVA
    Par nebil dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 06/01/2012, 18h57
  2. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  3. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29
  4. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo