Bonjour à tous,
je souhaiterai savoir s'il existe une fonction qui permet de transformer un int en double.
merci
Bonjour à tous,
je souhaiterai savoir s'il existe une fonction qui permet de transformer un int en double.
merci
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; }
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 :
ime renvoie :
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; }
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 !
C'est peut-etre parce que tu ne sais pas utiliser printf non ?
Résultat
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; }
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
C'est exactement la teneur de ma réponse.Envoyé par nherment
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; }Conversion forcée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 x=123 y=123.000000 Press ENTER to continue.
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.Totalement inepte. il faut apprendre le langage C et la bonne utilisation des typecast avant de sortir des âneries pareilles.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 !
Ton code est très faux :
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 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
c'est nettement plus clair...
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; }
Avant d'aller chercher des choses tordues, il faut commencer par utiliser le langage correctement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 entier :999999999 double :999999999.000000 Press ENTER to continue.
En pincipe, c'est automatique, mais parfois, il faut forcer avec un (double). Montre exactement ce que tu veux faire.Envoyé par nherment
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).
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!
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().Envoyé par nherment
Sans prototype, le comportement est indéterminé.
Partager