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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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