Bonjour,
j'ai un :
double x;
je récupère sa première moitié dans un float :
float a = (float)x;
je cherche à récupéer la 2ème moitié, je fais comment ??
Merci bcp
Bonjour,
j'ai un :
double x;
je récupère sa première moitié dans un float :
float a = (float)x;
je cherche à récupéer la 2ème moitié, je fais comment ??
Merci bcp
J'ai du mal à comprendre l'idée que tu as derrière la tête. Pouquoi veux tu séparrer un Double en deux float?
Ça ne me parait compliqué et sans intérêt.
le double il est codé sur 8 octets le float est sur 4, j'ai besoin de mettre chaque 4 octets du double à part
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 long xL = Double.doubleToLongBits(x); int xI1 = (int)xL; int xI2 = (int)(xL >> 32); float y1 = Float.intBitsToFloat(xI1); float y2 = Float.intBitsToFloat(xI2);
Mais comme on a déjà dit, faire du C++ en Java, ça ne vas pas super bien...
j'ai essayé ce code et ça marche, sauf que il y a une perte de précision dans le résultat
au lieu de me donner la résultat :
ça me génère
Code : Sélectionner tout - Visualiser dans une fenêtre à part 272008320221930670000000.000000
est ce que c'est du à la première conversion en Long ???????
Code : Sélectionner tout - Visualiser dans une fenêtre à part 2.7200832E23
Normalement avec ce code, il ne devrait pas y avoir de perte de précision. Es-tu sur que ce n'est pas ta fonction d'affichage fait un d'arrondi?
C'est d'ailleurs impossible de le faire de manière exacte en effet:
les floats ont 23 bits pour la mantisse, 8 bits pour l'exposant et 1 bit pour le signe alors que les doubles ont 52 bits pour la mantisse, 11 bits pour l'exposant, 1 bit pour le signe.
Dont même avec 2 float, tu ne pourras pas stoker toute la mantisse.
en C++ c'est possible en utilisant un pointeur :
mais en java ????
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 double x; float a, b; float *ip; ip = (float)&x; a = (*ip); ++ip; b = (*ip);
Même en c++, ce code est erroné. Le choix des type a et b est erroné et ils ne stockeront jamais, dans ce cas, un float qui aura du sens par rapport à x. De plus, rien dans les spécification c++ ne te dit que le float est la moitié (en taille bits) d'un double. Tout ce que dit la spécification C++ c'est que taille(float)<=taille(double)<=taille(long double).
Si ce code fonctionne chez toi, c'est jsute parce que tu as la chance d'utiliser un compilateur/une architecture utilisant une taille de float deux fois inférieure à la taille d'un double.
Rien ne sert d'essayer de transcrire du C++ en java et encore moins du C++ erroné. La solution de uther d'ailleurs est la plus propre pour récupérer et manipuler les bits d'un double.
Si c'est juste séparer en plusieurs parties sans te soucier de la valeur il est plus simple de passer par doubleToLongBits() qui te retournera un long. Tu peux ainsi découper le découper facilement en morceaux avec un masque et des décalages binaire.
Tu peux ensuite reconstruire le double avec longBitsToDouble()
En suivant ton exemple, ca donnerait:
Je pense que tu peux garder le résultat dans des int car comme les float ils font 32 bit. De toute façon les valeurs de tels flottants n'auraient absolument aucun sens.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 double x; long l = Double.doubleToLongBits(x); int a = ( l >> 32) & 0xFFFFFFFF; int b = l & 0xFFFFFFFF;
Mais si tu tiens tout de même à avoir du float, tu peux utiliser Float.intBitsToFloat()
j'ai pas bien compris la ligneest-ce que ceci récupère les 32 bits dans le int et & 0xFFFFFFFF c pourquoi faire ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part int a = ( l >> 32) & 0xFFFFFFFF;
Partager