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 :

Zero machine 2^-1074 = 0 ?


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Zero machine 2^-1074 = 0 ?
    Bonjour,

    Lors d'un TP, je dois trouver le zéro machine en simple et double précisions.

    J'ai pu sans difficulté trouvé le zéro machine en simple précision.

    Cependant, lorsque je passe en double précision, mon "zero" qui devrait être égal à 2^-1074 est égal à 0 alors qu'il devrait être égal à environ 10-324.

    Je tire ce nombre de Wikipedia. Pouvons-nous vraiment coder ce nombre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <math.h>
    int main()
    {
    	double xmin=1./pow(2,1022), zero=1./pow(2,1074);
    	double xplus, xmoins;
    	xplus=xmin+zero;
    	xmoins=xmin-zero;
     
    }
    Mon programme n'a pas de sortie. Cependant même en passant au déboggeur, j'ai la confirmation que 2-1074 est égal à 0 puisque sa représentation binaire est composée de 64 zéros successifs.

    Remarque : 2^-1022 est le xmin : le plus petit flottant positif normalisé en double précision sous la norme IEEE 754.

    Ici, je voulais voir les "voisins" du xmin.

    J'ai déjà utilisé des programmes pour déterminer le zéro machine mais dès 2^-1024, on m'indique que ce nombre vaut 0 avec encore ici une représentation binaire avec 64 zéros.

    Je me demande donc pourquoi j'ai ce problème là puisque je n'ai connu aucun problème en simple précision (float).



    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    C'est parce que tu fais l'hypothèse que « pow() » est une fonction parfaite mais ça ne l'est pas. « pow() » est une fonction dans le sens C du terme et pas un opérateur du compilateur. Ça signifie qu'il s'agit d'une routine qui va être appelée à l'exécution et qui va donc être soumise, comme le reste, à l'imprécision de tes chiffres.

    Ensuite, lorsque tu travailles sur des nombres extrêmes, même si le résultat attendu reste dans le domaine de validité, il est tout-à-fait possible que les calculs intermédiaires, eux, soient en dehors.

    Je me demande donc pourquoi j'ai ce problème là puisque je n'ai connu aucun problème en simple précision (float).
    Parce la plupart des fonctions travaillant sur des nombres flottants le font sur des double par défaut en l'absence de consigne contraire, pour les raisons ci-dessus. Donc, si tes float ont été convertis en double avant d'être re-convertis en floats au final, tu restes toujours dans un domaine valide. Si tu travailles directement sur des double, tu vas être confronté à ces problèmes.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    En effet, en utilisant des boucles déterministes, j'ai pu calculer mon "zero" et maintenant le problème est résolu.

    Merci beaucoup Obsidian pour cette réponse rapide et tout à fait claire

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

Discussions similaires

  1. Modifier le "nom machine" (hostname)
    Par hawax dans le forum Réseau
    Réponses: 6
    Dernier message: 06/03/2009, 10h50
  2. Fonction/méthode pour obtenir l'IP de la machine
    Par sirex007 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 10/04/2003, 14h36
  3. Code machine
    Par Willand dans le forum Assembleur
    Réponses: 2
    Dernier message: 20/01/2003, 18h44
  4. Lancer un programme, mais sur une autre machine
    Par GOUGOU1 dans le forum Réseau
    Réponses: 12
    Dernier message: 08/12/2002, 20h36
  5. Réponses: 4
    Dernier message: 10/09/2002, 17h09

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