Преобразование из неподписанного int в float - PullRequest
5 голосов
/ 04 августа 2010
warning C4244: '=' : conversion from 'unsigned int' to 'float', possible loss of data  

Разве float не может обрабатывать какие-либо значения из 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

integer) представление о том, что оно может поддерживать гораздо более широкий диапазон значений.

Любое понимание можетбудь полезным, спасибо.

http://msdn.microsoft.com/en-us/library/s3f49ktz%28VS.80%29.aspx

Ответы [ 5 ]

12 голосов
/ 04 августа 2010

'unsigned int' и 'float' используют 32 бита для хранения значений. Поскольку у поплавка больший диапазон, он обязательно жертвует некоторой точностью. Это означает, что есть некоторые беззнаковые значения типа int, которые не могут быть точно представлены в формате с плавающей точкой. MSDN предоставляет некоторые дополнительные сведения.

7 голосов
/ 04 августа 2010

Хотя float поддерживает более широкий диапазон значений, чем unsigned int, он делает это с меньшей точностью. Float имеет 23-битную мантиссу, которая, как вы писали, составляет всего около 7 десятичных цифр. целые числа без знака поддерживают более 9 десятичных цифр.

Предложение: используйте double, а не float.

Edit: На самом деле, я убираю это предложение; Типы данных с плавающей точкой и целые числа принципиально различны и не могут быть напрямую преобразованы. Какое целочисленное значение вы ожидаете получить за Single.MaxValue? Для Single.NegativeInfinity? Было бы полезно объяснить, почему вы хотите конвертировать из float в int.

3 голосов
/ 04 августа 2010

Из Википедия :

Одиночная точность, называемая «float» в семействе языков C, и «real» или «real * 4» в? Fortran. Это двоичный формат, который занимает 32 бита (4 байта) и имеет значение и имеет точность 24 бита (около 7 десятичных цифр).

С int, имеющим 32 бита (обычно) и с плавающей точкой, имеющей 32 бита (с частью, зарезервированной для экспоненты), существует много значений int, которые не могут быть точно представлены типом с плавающей запятой.

3 голосов
/ 04 августа 2010

Как вы заметили в своем вопросе, число с плавающей запятой занимает всего 7 цифр, а не 10 цифр в INT_MAX. Я полагаю, что это будет причиной для предупреждения C4244 при этом преобразовании.

2 голосов
/ 04 августа 2010

попробуйте это, чтобы понять ситуацию

float f = 0.0f;
while (f < (INT_MAX-1))
   f++;

, и вы увидите, что это действительно бесконечный цикл в системах, где int составляет 32 бита или меньше.

Что будет интересноэто прорваться в бесконечный цикл и посмотреть, каково значение для f такое, что f == f + 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...