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 :

transformer int en double


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut transformer int en double
    Bonjour à tous,

    je souhaiterai savoir s'il existe une fonction qui permet de transformer un int en double.

    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 41
    Par défaut
    Pour convertir en un autre type compatible, il suffit de placer le nom du type vers lequel tu veut convertir la valeur entre parenthese au debut de l'expression:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double fromInteger(int i){ return (double) i; }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut
    ce serait pas mal si c'était aussi simple.

    En fait si on caste un entier dans un double le valeur envoyée l'est sous forme binaire. Ce sont les 1 et les 0 qui sont copiés. Le problème est que l'encodage des int et des double n'est pas le meme. Les doubles sont codés sur 8 octets et les int sur 4 octets.

    ainsi le programme suivant :
    i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    nt main(void)
    {
    	double x;
    	int y=999999999;
    		x=(double)y;
    		printf("entier :%i\ndouble :%d\n",y,x);
     
    	return 0;
    }
    me renvoie :
    entier :999999999
    double :-8388608

    Les deux sont bien différents !
    Si on veut transférrer un int de manière correcte dans un double il faut donc reprendre l'encodage des deux et faire ca en modifiant bit à bit (ou par un moyen détourné en incrémentant le double suivant la valeur de l'int). Bref si je peux éviter de perdre du temps et utiliser un truc déjà fait ce serait parfait !

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    C'est peut-etre parce que tu ne sais pas utiliser printf non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    int main(void)
    {
        double x;
        int y=999999999;
     
        x=(double)y;
     
        printf("entier :%d\ndouble :%f\n",y,x);
     
        return 0;
    }
    Résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    C:\Documents and Settings\Skyrunner\Mes documents>test
    entier :999999999
    double :999999999.000000

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nherment
    ce serait pas mal si c'était aussi simple.
    C'est exactement la teneur de ma réponse.

    Conversion automatique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
     
    int main (void)
    {
       int x = 123;
       double y = x;
     
       printf ("x=%d y=%f\n", x, y);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x=123 y=123.000000
     
    Press ENTER to continue.
    Conversion forcée :
    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 (void)
    {
       int x = 123;
     
       printf ("x=%d x=%f\n", x, (double) x);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x=123 x=123.000000
     
    Press ENTER to continue.
    Si on veut transférrer un int de manière correcte dans un double il faut donc reprendre l'encodage des deux et faire ca en modifiant bit à bit (ou par un moyen détourné en incrémentant le double suivant la valeur de l'int). Bref si je peux éviter de perdre du temps et utiliser un truc déjà fait ce serait parfait !
    Totalement inepte. il faut apprendre le langage C et la bonne utilisation des typecast avant de sortir des âneries pareilles.

    Ton code est très faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:6: warning: implicit declaration of function `printf'
    main.c:6: warning: int format, double arg (arg 3)
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 2 seconds)
    0 errors, 2 warnings
    Une fois corrigé :
    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
     
    /* -ed- obligatoire pour printf() */
    #include <stdio.h>
     
    int main (void)
    {
       int y = 999999999;
     
    /* -ed- cast inutile. Supprime. */
       double x = y;
     
    /* -ed- formateur errone */
       printf ("entier :%i\ndouble :%f\n", y, x);
     
       return 0;
    }
    c'est nettement plus clair...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    entier :999999999
    double :999999999.000000
     
    Press ENTER to continue.
    Avant d'aller chercher des choses tordues, il faut commencer par utiliser le langage correctement.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nherment
    je souhaiterai savoir s'il existe une fonction qui permet de transformer un int en double.
    En pincipe, c'est automatique, mais parfois, il faut forcer avec un (double). Montre exactement ce que tu veux faire.

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Ici ça va, la variable est promu, mais il ne faut pas oublié que dans l'autre sens, il peut y avoir une perte d'information.

    En effet le double fait 8 octets, le int seulement 4 (sur une plateforme classique j'entends). Du coup quand tu passes de double à int tu as une perte de 4 octets (octets de poids forts).

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Par défaut
    exact !
    hmhm... quel tete en l'air !

    je pensais que %d correspondait à un double mais c'est pour l'affichage d'un int.

    donc effectivement il faut faire %f car l'encodage des double est identique aux float et il faut les traiter comme tel.

    c'est pour les long double qu'il faut utiliser %Lf

    merci!

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nherment
    donc effectivement il faut faire %f car l'encodage des double est identique aux float
    Rien à voir. "%f" c'est pour le double et le float, parce qu'avec printf(), et à condition, comme por toutes les fonctions 'variadics', que le prototype soit visible (<stdio.h>), un float est automatiquement promu en double avant que sa valeur ne soit passée à printf().

    Sans prototype, le comportement est indéterminé.

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

Discussions similaires

  1. [Conversion]int to double
    Par frouge dans le forum Général Java
    Réponses: 6
    Dernier message: 03/02/2012, 09h34
  2. long int VS double
    Par Naira dans le forum C++
    Réponses: 3
    Dernier message: 02/03/2007, 11h34
  3. int vs double: qui est le plus rapide?
    Par Chewbi dans le forum C++
    Réponses: 23
    Dernier message: 25/03/2006, 02h58
  4. [Débutant] transformer int to string
    Par rherrad dans le forum Langage
    Réponses: 2
    Dernier message: 26/11/2005, 12h23
  5. [DEBUTANT] Transformer une variable Double en STring
    Par Battosaiii dans le forum Langage
    Réponses: 6
    Dernier message: 13/06/2005, 16h43

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