1. #1
    Membre émérite

    Inscrit en
    mars 2002
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 255
    Points : 2 533
    Points
    2 533

    Par défaut String -> long double (_strlold ?)

    Je connais 'strlod' qui sert à convertir une chaîne en double, mais pour les long double ? J'ai trouvé '_strtold' sous Windows, mais ce n'est pas du 'ANSI-C' ... Est-ce que le 'long double' n'est pas du ANSI-C ??? Il me faudrait une fonction portable si possible !

    En passant, il existe une fonction ou un formateur printf pour afficher des long double au format << scientifique >> ? 100 -> "1e2", -497e-3 -> "-4.97e-5", etc. Et pour le format << ingénieur >> en passant : des puissances de 10 toujours mutliples de 3 : 100 -> "0.1e3", -497e-3 -> "-0.497e-6", etc. Ou bien faut-il les reprogrammer ??? Je voudrais bien, mais le format double est encore assez flou pour moi!

    PS: Je bosse sous Windows et Linux, et je cherche du 100% portable !

    @+ Haypo

  2. #2
    Membre averti
    Avatar de Greg01
    Profil pro
    Inscrit en
    mai 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2002
    Messages : 296
    Points : 412
    Points
    412

    Par défaut

    t'as essayé un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long double ld;
    sscanf(string, "%Lf", ld);
    pour les formateurs, regarde dans les cours et tutoriels pour apprendre C.

  3. #3
    Membre averti

    Inscrit en
    juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 97
    Points : 311
    Points
    311

    Par défaut

    Long double: pas standard.
    Format Scientifique: %e mais l'exposant a toujours 3 chiffres.
    Format ingénieur: je pense pas.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  4. #4
    Membre émérite

    Inscrit en
    mars 2002
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 255
    Points : 2 533
    Points
    2 533

    Par défaut

    Ben non, ça va pas : j'ai programmé un interprétateur pour une calculatrice scientifique. C'est à dire qu'à partir d'une chaîne de caractère (qui vient du clavier/fichier) on sort une expression (dans mon format). Je vais pas faire un scanf pour chaque nombre, ce serait barbare !

    @+ Haypo

  5. #5
    Membre averti
    Avatar de Greg01
    Profil pro
    Inscrit en
    mai 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2002
    Messages : 296
    Points : 412
    Points
    412

    Par défaut

    eh, je t'ai pas dis de faire un scanf mais un sscanf ! La différence se situe dans le flux d'entrée. Le scanf attend la saisie de l'utilisateur, mais le sscanf prend comme entrée un char*. Donc la commande que je t'ai filé ne demande pas une saisie de la part de l'utilisateur. Elle permet de découper une chaine de caractère en différentes valeurs.

    Essaie ce code (chez moi ça marche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    int main()
    {
         long double ld;
         char str[50] = "4456786.146";
     
         sscanf(str,"%Lf", &ld);
         printf("%Lf\n",ld);
         return 0;
    }
    J'ai testé, et ça fait ce que tu demandes ! Et en plus cette technique fonctionne avec n'importe quel formatage de ta chaine.

    PS : j'avais une faute dans mon précedent code, j'avais oublié le &

    Greg

  6. #6
    Membre émérite

    Inscrit en
    mars 2002
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 255
    Points : 2 533
    Points
    2 533

    Par défaut

    Oups, j'ai pas fait attention! Je ne savais même pas que ça existait "sscanf" !!! Je vais essayer ça.

    @+ Haypo

  7. #7
    Membre averti
    Avatar de Greg01
    Profil pro
    Inscrit en
    mai 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2002
    Messages : 296
    Points : 412
    Points
    412

    Par défaut

    tiens moi au courant du résultat ....

  8. #8
    Membre émérite

    Inscrit en
    mars 2002
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 255
    Points : 2 533
    Points
    2 533

    Par défaut

    Ca marche nickel! En plus j'ai corrigé un bug dans ma calto : j'utilise des 'long long' (entier sur 64 bits), mais j'utilisais strtol (string to long). Un p'tit sscanf est c'est dans la poche!

    Extrait de mon HMath.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include "Longlong.h"
     
    // Utilise les nombres réels sur 80 bits (au lieu de 64) ?
    #define UTILISE_LONG_DOUBLE
     
    #ifdef UTILISE_LONG_DOUBLE
      typedef long double Reel;
    #  define FORMAT_REEL "%Lg"
    #else
      typedef double Reel;
    #  define FORMAT_REEL "%lg"
    #endif
     
    #ifdef UTILISE_LONG_LONG
      typedef longlong Entier;
    #  define FORMAT_ENTIER "%Li"
    #else
      typedef long Entier;
    #  define FORMAT_ENTIER "%li"
    #endif
    Extrait de mon Interpret.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    // Convertion txt -> réel
    Reel Nbr;
    sscanf (txt,FORMAT_REEL,&Nbr);
    ...
    // Convertion txt -> entier
    Entier Nbr;
    sscanf (txt,FORMAT_ENTIER,&Nbr);
    ...
    Pour info, le 'long long' a été introduit avec la norme ISO C99, gcc le supporte, et p'tit un ou deux autres compilo. Mais sous Windows, on a "__int64". Extrait de mon LongLong.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifdef _Windows
    #  define UTILISE_LONG_LONG
      typedef __int64 longlong;
    #elif defined(linux)
      typedef long long longlong;
    #  define UTILISE_LONG_LONG
    #endif
    Merci encore !
    @+ Haypo

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

Discussions similaires

  1. Affichage long double
    Par slate dans le forum C++
    Réponses: 5
    Dernier message: 07/02/2006, 19h04
  2. String vers un Double
    Par hugoferd dans le forum Langage
    Réponses: 1
    Dernier message: 16/10/2005, 21h46
  3. Réponses: 4
    Dernier message: 12/09/2003, 12h38
  4. abs pour un long double
    Par barthelv dans le forum C
    Réponses: 2
    Dernier message: 23/07/2003, 17h16
  5. Réponses: 2
    Dernier message: 05/06/2002, 13h29

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