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

Bibliothèque standard C Discussion :

Affichage des floats/doubles


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut Affichage des floats/doubles
    Bonsoir,

    Je souhaiterais réaliser une fonction charger de l'affichage des doubles(sans bien sur appeler une quelconque fonction de la stl).
    J'avais d'abord envisager de séparer la partie entière et la partie décimal. Ca marche tres bien au début mais la mentisse des doubles est de 52 bits, donc impossible d'en contenir la totalité dans un int de 32 :/
    Une autre solution aurais était de parcourir récursivement le nombre avec %10 et /10, sauf que le modulo n'est pas disponible pour les doubles... (et si je le fait a la main on vas pas s'en sortir niveau temps...)
    Quelqu'un aurait-il une autre piste a me proposer? Une idee sur le fonctionnement de printf?

    Bonne soirée, SE
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par SulphurEagle Voir le message
    (sans bien sur appeler une quelconque fonction de la stl).
    La stl ? en C ?
    Citation Envoyé par SulphurEagle Voir le message
    la mentisse des doubles est de 52 bits, donc impossible d'en contenir la totalité dans un int de 32 :/
    Un int de 64 bits ne fera pas l'affaire ? --> faq

  3. #3
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Citation Envoyé par mabu Voir le message
    La stl ? en C ?
    Ou std, j'ai du mal avec les noms :/

    Citation Envoyé par mabu Voir le message
    Un int de 64 bits ne fera pas l'affaire ? --> faq
    Oui, ca le ferait, si on ne devais pas respecter la norme ISO C90 (donc pas de type long long)

    Je cherche une methode qui ne dependrais pas de la longueur du type entier utiliser...
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par SulphurEagle Voir le message
    Une autre solution aurais était de parcourir récursivement le nombre avec %10 et /10, sauf que le modulo n'est pas disponible pour les doubles...
    Mais reproductible: a % b équivaut à a - floor(a/b)*b, non?

    (et si je le fait a la main on vas pas s'en sortir niveau temps...)
    j'ai pourtant bien peur que printf() procède lui-même par divisions successives...
    Par contre, tu auras sans doute besoin d'un buffer intermédiaire, voire plus (typiquement, j'en utilise un dans mes fonctions d'affichage d'entiers, car les divisions successives donnent le plus petit chiffre en premier).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Mais reproductible: a % b équivaut à a - floor(a/b)*b, non?
    Oui mais justement, comment implémenter floor sans cast ? ^^ C'est un peux un serpent qui se mord la queu :/

    Citation Envoyé par Médinoc Voir le message
    j'ai pourtant bien peur que printf() procède lui-même par divisions successives...
    Par contre, tu auras sans doute besoin d'un buffer intermédiaire, voire plus (typiquement, j'en utilise un dans mes fonctions d'affichage d'entiers, car les divisions successives donnent le plus petit chiffre en premier).
    Le problème est que l'ors de la récupération dans un entier, après un certains nombre de caste pour récupérer le nombre a afficher et soustraire la valeur au double (ou meme sans soustraire), le résultat est erronée (je ne parvient pas vraiment a comprendre pourquoi...)

    Sinon pour le buffer, si tu parle de l'affichage, je fait ca par récursivité et cela fonctionne très bien pour les entiers.
    Enfin, merci de l'attention que tu porte a mon problème
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par SulphurEagle Voir le message
    Oui mais justement, comment implémenter floor sans cast ? ^^ C'est un peux un serpent qui se mord la queu :/
    Il faut savoir ce qu'ils veulent à l'EPITA : S'ils ne veulent pas que tu utilises floor() ni long long, il ne peuvent pas t'interdire de supposer que les flottants sont au format IEEE754.
    Donc, tu peux utiliser des opérations binaires pour extraire l'exposant, et t'en servir pour faire un ET binaire permettant de mettre à zéro tous les bits "fraction" de la mantisse...

    Mais sans long long, c'est l'endianness qui va poser problème... D'un autre côté, rien ne t'empêche de la tester en run-time...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Il faut savoir ce qu'ils veulent à l'EPITA : S'ils ne veulent pas que tu utilises floor() ni long long, il ne peuvent pas t'interdire de supposer que les flottants sont au format IEEE754.
    Donc, tu peux utiliser des opérations binaires pour extraire l'exposant, et t'en servir pour faire un ET binaire permettant de mettre à zéro tous les bits "fraction" de la mantisse...

    Mais sans long long, c'est l'endianness qui va poser problème... D'un autre côté, rien ne t'empêche de la tester en run-time...
    (Epitech, epita ils donnent trop facilement les points ^^)

    Je voulais justement éviter d'en venir au binaire mais apparemment c'est la seul solution ^^

    Donc, comment me conseil tu de procéder?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Commencer par obtenir l'exposant, car il tiendra toujours dans un long et surtout, cette fonction n'a beaucoup de travail que pour une certaine "zone" d'exposants: Pour les exposants trop négatifs, il n'y a pas de partie entière (retourner zéro), et pour les exposants trop positifs, il n'y a pas de partie décimale.
    Il te restera environ autant de valeurs "valides" d'exposant qu'il y a de bits dans la mantisse, tu devras donc t'en servir pour définir un masque (typiquement par décalage de bits) à appliquer sur celle-ci.

    Je peux aussi te conseiller de faire des fonctions binaires marchant sur des "grands entiers", car en l'absence de long long, la mantisse peut être qualifiée de "grand entier". Tu as besoin du ET binaire et du décalage de bits.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Mode d'affichage des float
    Par devhercule dans le forum Général Java
    Réponses: 2
    Dernier message: 12/07/2012, 11h27
  2. Réponses: 3
    Dernier message: 30/10/2010, 10h49
  3. Affichage des données d'une GridView en double
    Par clem5-9 dans le forum ASP.NET
    Réponses: 13
    Dernier message: 17/05/2010, 16h06
  4. Probleme affichage des double
    Par pyth35 dans le forum Composants
    Réponses: 3
    Dernier message: 27/08/2009, 15h43
  5. Arrondir correctement des float et des doubles
    Par ccensam dans le forum Débuter
    Réponses: 3
    Dernier message: 08/04/2008, 15h08

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