OVH Cloud OVH Cloud

conversions...

1 réponse
Avatar
Frédéri MIAILLE
Lors d'un cast implicite de float vers double j'ai rencontré un problème (un
symptôme) que je n'arrive pas à cerner et à reproduire.
Je voudrais savoir si on peut trouver un problème dans l'expression
suivante.
double a;
float b;
b=13.51234f;
a=b;
Quelle que soit la valeur de la variable "b", la variable "a" va t'elle
toujours pouvoir contenir cette valeur quelle qu'elle soit ?
Maintenant à l'inverse, je voudrais savoir :
b=a;
Ca donne quoi ?
La troncation de la variable de type double vers la variable de type float
se produit comment ? Je veux dire, j'ose espérer que ce sont bien les
décimales qui sont tronquées en priorité et non la partie entière du nombre.
Quelqu'un pourrait-il me confirmer ça ?

Autre question mais le sujet à été abordé maintes fois maintenant. Je n'ai
cependant toujours pas bien compris.

Pour obtenir la partie entière d'un nombre réel, certaines fois je procède
de la manière suivante :
double T; // Ou float
T=132.852;
int a;
a=T;
Ou encore :
double Decimals;
Decimals=T-(unsigned int)T;

Je sais, c'est sauvage mais je retrouve avec cette méthode de très bonnes
performances. Je suis prêt à y renoncer si on m'explique les dangers de ces
pratiques et une autre méthode performante à suivre.

Enfin, si quelqu'un pouvait avoir l'amabilité de me donner un lien ou une
explication minutieuse de la représentation binaire des nombres réels...
explication dans laquelle on parle evidémment de la Mantisse. Je connaît le
mot, mais en réalité, c'est bien tout.

--
Frédéri MIAILLE
fr.comp.lang.c
fr.comp.lang.c++
fr.comp.graphisme.programmation
fr.comp.os.ms-windows.programmation

1 réponse

Avatar
Serge Paccalin
Le lundi 1 septembre 2003 à 00:29, Frédéri MIAILLE a écrit dans
fr.comp.lang.c :

Lors d'un cast implicite de float vers double j'ai rencontré un problème (un
symptôme) que je n'arrive pas à cerner et à reproduire.
Je voudrais savoir si on peut trouver un problème dans l'expression
suivante.
double a;
float b;
b.51234f;
a=b;
Quelle que soit la valeur de la variable "b", la variable "a" va t'elle
toujours pouvoir contenir cette valeur quelle qu'elle soit ?


Oui.

6.3.1.5 Real floating types
1 When a float is promoted to double or long double, or a double is
promoted to long double, its value is unchanged.

Maintenant à l'inverse, je voudrais savoir :
b=a;
Ca donne quoi ?


Si la valeur est en-dehors de l'intervalle représentable, comportement
indéfini. Si la valeur n'est pas exactement représentable, une
altération de la valeur. Si la valeur est exactement représentable, elle
est conservée.

2 When a double is demoted to float, a long double is demoted to
double or float, or a value being represented in greater precision and
range than required by its semantic type (see 6.3.1.8) is explicitly
converted to its semantic type, if the value being converted can be
represented exactly in the new type, it is unchanged. If the value
being converted is in the range of values that can be represented but
cannot be represented exactly, the result is either the nearest higher
or nearest lower representable value, chosen in an
implementation-defined manner. If the value being converted is outside
the range of values that can be represented, the behavior is
undefined.

La troncation de la variable de type double vers la variable de type float
se produit comment ? Je veux dire, j'ose espérer que ce sont bien les
décimales qui sont tronquées en priorité et non la partie entière du nombre.
Quelqu'un pourrait-il me confirmer ça ?


Oui, si il y altération, c'est vers une des deux valeurs les plus
proches.

Autre question mais le sujet à été abordé maintes fois maintenant. Je n'ai
cependant toujours pas bien compris.

Pour obtenir la partie entière d'un nombre réel, certaines fois je procède
de la manière suivante :
double T; // Ou float
T2.852;
int a;
a=T;
Ou encore :
double Decimals;
Decimals=T-(unsigned int)T;

Je sais, c'est sauvage mais je retrouve avec cette méthode de très bonnes
performances. Je suis prêt à y renoncer si on m'explique les dangers de ces
pratiques et une autre méthode performante à suivre.


Le danger, c'est quand la valeur est trop grande pour un int. Mais il
est vrai que dans ce cas, partie entière et partie décimale ne sont plus
très significatives.


Enfin, si quelqu'un pouvait avoir l'amabilité de me donner un lien ou une
explication minutieuse de la représentation binaire des nombres réels...
explication dans laquelle on parle evidémment de la Mantisse. Je connaît le
mot, mais en réalité, c'est bien tout.


Avec le nombre +1,6 × 10 puissance -23 :

+ est le signe
1,6 est la mantisse (décimale)
-23 est l'exposant (décimal).

La représentation reprend le même principe, mais avec une puissance de
2, au lieu de 10.


--
___________ 2003-09-01 08:41:00
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763