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 :

Initialisation précise de flottant


Sujet :

C

  1. #1
    Membre averti Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Points : 441
    Points
    441
    Par défaut Initialisation précise de flottant
    Bonjour,

    je voudrais pouvoir initialiser un flottant avec une valeur précise.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double a;
    a = 2.3254;
    Dans ce cas, les choses sont simples.
    Par contre, si la valeur de a est issue d'un calcul compliqué et que je veux coder cette valeur en dur, comment puis-je faire pour initialiser la variable a avec exactement la même valeur que celle obtenue par le calcul compliqué ? Je passe par l'écriture binaire ?

  2. #2
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Eh bien, tu réutilises le résultat en le sauvegardant dans une variable. Il nous faudrait plus de code ; j'ai personnellement du mal à voir où tu veux en venir.

    Bonne journée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Les nombres flottants sont par nature imprécis.
    Il n'y a pas de paradis à jouer avec.

    Par contre, si tu l'affiche avec une précision suffisante, tu peux utiliser la valeur comme initialiseur
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    Salut !

    Si tu veux une précision maximale, il vaut mieux utiliser des double.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double resultat = 2.0 * 3.141592654 * 9.3658;
    Tu peux ainsi réutiliser ta variable plus tard sans avoir perdu en précision.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hoa,
    Citation Envoyé par AceSir Voir le message
    Salut !

    Si tu veux une précision maximale, il vaut mieux utiliser des double.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double resultat = 2.0 * 3.141592654 * 9.3658;
    Tu peux ainsi réutiliser ta variable plus tard sans avoir perdu en précision.
    Plutôt très optimiste, et même carrément faux.

    À quelques "rares" valeurs près représentables exactement, on perd toujours en précision avec les flottants, c'est intrinsèque, on n'y peut rien, sinon repousser la limite en utilisant du calcul multiprécision.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    Avec ce code, on a une perte de précision (voir même de magnitude parfois) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float f = 2.0 * 3.141592654 * 9.3658;
    Mais avec le code que j'ai donné, le résultat de 2.0 * 3.141592654 * 9.3658 sera stocké dans sa version la plus précise possible (sauf évidement si l'on s'amuse à faire des structures pour stocker plus efficacement des nombres).

    Je n'ai pas dis que nous aurions le résultat réel, simplement que l'on ne perdra pas la précision donnée par la machine lors du calcul.

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hoa,
    Citation Envoyé par AceSir Voir le message
    Je n'ai pas dis que nous aurions le résultat réel, simplement que l'on ne perdra pas la précision donnée par la machine lors du calcul.
    Avec un double (8 octets), ce n'est pas vrai.

    Avec Visual Studio, tu restes bloqué là, car pour lui, long double fait la même taille que double (le seul moyen de contourner ce problème avec VS est de créer soi-même une classe, avec toute la partie calculs proprement dits en assembleur ... du boulot en perspective).

    Mais avec GCC, long double fait 12 octets, dont 10 seulement sont utilisés (ils ont probablement pris 12 octets pour garder un alignement sur un multiple de 4 ?), et là, tu profites de la précision maximale du FPU.

    En Pascal, avec un type dit extended, Turbo Pascal savait déjà faire ça dans les années 90 (et peut-être avant, je ne sais plus).

    Si les cons volaient, il ferait nuit à midi.

  8. #8
    Membre averti Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par leternel Voir le message
    Les nombres flottants sont par nature imprécis.
    Il n'y a pas de paradis à jouer avec.

    Par contre, si tu l'affiche avec une précision suffisante, tu peux utiliser la valeur comme initialiseur
    Je n'ai sans doute pas été clair. Il n'est pas question de précision ici. Si j'ai une variable codée dans un flottant double précision, l'écriture binaire de ses 64 bits correspond bien à une valeur précise et fixe.

    Ce que je veux, c'est être capable d'initialiser en dur un flottant double précision en reproduisant cette valeur précise et fixe qui est décrite par cette représentation binaire.

    Pour être encore plus clair, imaginez une suite de 64 bits à 0 ou à 1. Si j'interprète cette suite comme étant un flottant double précision, j'obtiens bien une valeur précise. Et bien, c'est à cette valeur que je veux initialiser ma variable. et en dur, c'est-à-dire avec une écriture du style

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu peux procéder en deux fois:
    d'abord tu interprete la séquence comme un entier 64bits, puis tu écris un code proche de double f = reinterpret_cast<double>(65536);
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Membre expérimenté

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 545
    Points : 1 429
    Points
    1 429
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    uint64_t IEEE754_bin = 0xDEADDEADDEADDEAD;
    double a = *((double *)&IEEE754_bin);// BEURK!!!!!
    Attention cela ne peut pas marcher pour les long double car il n'existe pas d'entiers définis sur 80 bits en C.

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Citation Envoyé par mith06 Voir le message
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uint64_t IEEE754_bin = 0xDEADDEADDEADDEAD;
    double a = *((double *)&IEEE754_bin);// BEURK!!!!!
    Attention cela ne peut pas marcher pour les long double car il n'existe pas d'entiers définis sur 80 bits en C.
    j'avais pas pensé à l'hexa. Du coup, ma proposition serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uint64_t IEEE754_bin = 0xDEADDEADDEADDEAD;
    double a = reinterpret_cast<double>(IEEE754_bin);// beurk!
    ou encore
    double a = reinterpret_cast<double>(0xDEADDEADDEADDEADull);// beurk!(ull est le spécifieur de unsigned long long, qui est défini par C++11)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2013, 07h03
  2. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 17h37
  3. Réponses: 8
    Dernier message: 13/01/2003, 17h45
  4. Créer une fenêtre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 10h46
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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