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

VB.NET Discussion :

Erreur de calcul sur Single (ou Double)


Sujet :

VB.NET

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    Points : 206
    Points
    206
    Par défaut Erreur de calcul sur Single (ou Double)
    Quelqu'un peut-il m'expliquer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim N1 As Single = 135.68
            Dim N2 As Single = 0.59
            Dim N3 As Single = N1 * N2
    Normalement, on devrait obtenir N3=80.0512
    Eh ben non ! VB trouve que N3=80.05119 !!!

    EDIT :
    Bon j'ai trouvé une réponse ici :
    http://msdn.microsoft.com/fr-fr/libr...v=vs.100).aspx
    Mais ça va pas simplifier mon analyse.

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Salut au risque de me faire lincher par les spécialistes,

    Tu peux tout multiplier par 100 ou 1000 par exemple si tu sait combien tu a de chiffre apres la virgule au maximum, on se sert pas de cette technique en embarqué, en plus les calcule sur les entier sont bien plus rapide

  3. #3
    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 chaparo Voir le message
    Tu peux tout multiplier par 100 ou 1000 par exemple si tu sait combien tu a de chiffre apres la virgule au maximum, on se sert pas de cette technique en embarqué, en plus les calcule sur les entier sont bien plus rapide
    En quoi le fait qu'on se serve ou pas d'une technique en embarqué la qualifie ou la disqualifie ?

    Par ailleurs dans la mesure où tu ne sais pas ce qu'il va faire de ces valeurs derrières, lui suggérer de multiplier tout par 100 ou 1000 me semble une idée plus que bizarre.

    Si il applique par exemple des fonctions de calculs non linéaires derrières (et ça tu n'en sais rigoureusement rien) ta méthode ne marche pas.

    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

  4. #4
    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 mdevaux62 Voir le message
    Mais ça va pas simplifier mon analyse.
    Si tu n'as pas des ordres de grandeurs très élevés/très petits à manipuler, utilise le type decimal en lieu et place de single ou double et tu n'auras pas ce problème.

    Il faut comprendre que ces types à stockage mantisse-exposant sont plus destinés à du calcul physique (car ils peuvent manipuler des ordres de grandeur très grand ou très petit) qu'à du calcul financier, pour lequel les ordres de grandeur sont nettement plus petit mais on veut des valeurs décimales précises.

    De plus, le type Single ne sert plus à grand chose de nos jours (bouffer 4 octets au lieu de 8 est devenu anecdotique), prendre le type double systématiquement, pour ce type de calcul.

    Pour de la compta/gestion/finance (où on aime bien que 0 soit 0 et pas 0.00000000001, alors que en calcul physique on considére que c'est pas forcément important) le type decimal est plus adapté.

    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

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    N3=80.05119
    En réalité, N3 = 80.05119999... , l'écart de 0.00...01 étant du à la précision des single.

    utilise le type decimal en lieu et place de single ou double et tu n'auras pas ce problème.
    +1
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    En quoi le fait qu'on se serve ou pas d'une technique en embarqué la qualifie ou la disqualifie ?
    on se sert pas de cette technique en embarqué,
    J'ai oublié une lettre
    on se sert pas mal de cette technique en embarqué,

    Par ailleurs dans la mesure où tu ne sais pas ce qu'il va faire de ces valeurs derrières, lui suggérer de multiplier tout par 100 ou 1000 me semble une idée plus que bizarre.
    Si il applique par exemple des fonctions de calculs non linéaires derrières (et ça tu n'en sais rigoureusement rien) ta méthode ne marche pas.
    Tu peux tout multiplier par 100 ou 1000 par exemple si tu sais combien tu as de chiffres après la virgule au maximum
    J'ai bien précisé si il avait toujours le même nombre de chiffre après la virgule après il suffit de rediviser par le même nombre pour repasser en nombres décimaux.

  7. #7
    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 chaparo Voir le message
    J'ai bien précisé si il avait toujours le même nombre de chiffre après la virgule après il suffit de rediviser par le même nombre pour repasser en nombres décimaux.
    Sauf que cette idée de diviser pour remettre le point décimal à sa place à la fin ne marche que si il n'applique pas de calcul non linéaire, comme je l'ai écrit supra.

    Une simple élévation à la puissance invalide la méthode.

    Sans même parler de la capacité limitée (concernant l'ordre de grandeur) des entiers dès lors que tu la réduit en considérant qu'une partie du contenu est constitué de décimal "fictives".

    Bref, une façon très hasardeuse de procéder alors qu'il existe un type pour ce genre de calcul orienté gestion, c'est le type decimal.

    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

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Si tu n'as pas des ordres de grandeurs très élevés/très petits à manipuler, utilise le type decimal en lieu et place de single ou double et tu n'auras pas ce problème.
    Le type Decimal fonctionne effectivement parfaitement pour ce que je dois faire.
    Merci.

  9. #9
    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 mdevaux62 Voir le message
    Le type Decimal fonctionne effectivement parfaitement pour ce que je dois faire.
    Merci.
    De rien.

    Je t'invite à jeter un oeil ici, avec une démonstration très didactique concernant l'usage decimal vs float(single en VerBeux )

    Et n'oublie pas de marquer la discussion comme résolue.

    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

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    ou ici pour se rendre compte de la précision d'un Single (Float pour ceux qui pratique le C#).
    0.59 = 0x3F170A3D = 00111111 00010111 00001010 00111101
    0.58999998 = 0x3F170A3D = 00111111 00010111 00001010 00111101
    135.68 = 0x4307AE14 = 01000011 00000111 10101110 00010100
    135.679987 = 0x4307AE14 = 01000011 00000111 10101110 00010100
    Si le système restitue :
    135.679987*0.58999998, l'erreur est juste.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD17] Erreur de calcul sur Type monétaire
    Par legero dans le forum WinDev
    Réponses: 4
    Dernier message: 10/04/2013, 15h20
  2. [DeskI Xi3] erreur de calcule sur les moyennes de delais
    Par gillou13 dans le forum Débuter
    Réponses: 3
    Dernier message: 21/03/2011, 16h04
  3. Erreur de compilation sur un calcul de temps de diaporama
    Par epenede dans le forum VBA PowerPoint
    Réponses: 4
    Dernier message: 03/11/2009, 12h35
  4. Problème de calculer avec textbox et produire un single ou double ?
    Par zizou2007 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 27/01/2007, 18h59

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