La Conversion de type unsigned int en float
warning C4244: '=' : conversion from 'unsigned int' to 'float', possible loss of data
Ne faut-il pas flotter être capable de gérer n'importe quelle valeur de type int?
unsigned int: 0 to 4,294,967,295
float 3.4E +/- 38 (7 digits)
Wiki:
The advantage of floating-point representation over fixed-point (and
entier) la représentation est qu'il peut
le soutien d'un éventail beaucoup plus large de valeurs.
Aucune information serait utile, merci.
http://msdn.microsoft.com/en-us/library/s3f49ktz%28VS.80%29.aspx
Vous devez vous connecter pour publier un commentaire.
'unsigned int" et "flottent" à la fois utiliser 32 bits pour stocker des valeurs. Depuis un flotteur a une plus grande portée, elle a nécessairement des sacrifices au niveau de la précision. Cela signifie qu'il y a quelques unsigned int valeurs que ne peut pas être représentés avec précision dans un flotteur. MSDN fournit plus de détails.
Tout
float
prend en charge un large éventail de valeurs deunsigned int
, il le fait avec moins de précision. Les flotteurs ont un 23 bits de mantisse qui, comme vous l'avez posté, n'est que d'environ 7 chiffres après la virgule. unsigned ints soutien de plus de 9 chiffres après la virgule.Suggestion: utiliser
double
, pasfloat
.Edit:
En fait, je rétracter cette suggestion; à virgule flottante entier et les types de données sont fondamentalement différents et ne sont pas directement convertibles. Quelle valeur entière attendez-vous à obtenir pour
Single.MaxValue
? PourSingle.NegativeInfinity
? Expliquant pourquoi vous voulez convertir à partir defloat
àint
serait utile.Comme vous le notez dans votre question, le flotteur ne prend que 7 chiffres, plutôt que les 10 chiffres dans INT_MAX. Je crois que ce serait la raison pour donner un C4244 un avertissement à cette conversion.
De wikipédia:
Avec un int ayant 32 bits (en général) et d'un flotteur avoir 32 bits (avec une partie réservée pour l'exposant), il y a beaucoup d'int valeurs qui ne peuvent pas être exactement représentée par le type à virgule flottante.
essayez ceci pour comprendre la situation
et vous verrez que c'est vraiment une boucle infinie sur les systèmes où l'int de 32 bits ou moins.
Ce qui va être intéressant, c'est de percer dans la boucle infinie et de voir quelle en est la valeur de f telle que f = f + 1
printf("%f\n", float(1<<24)+1)
imprime un même nombre qui est évidemment faux.