2013-09-13 3 views
0
float f = 3.4028235E38F; 

будет компилироваться, ноЗачем нужен постфикс F, чтобы избежать ошибки?

float f = 3.4028235E38; 

выдает эту ошибку:

possible loss of precision 

в этом коде:

http://ideone.com/0Hu3dA

Я бы ожидать как раз наоборот, как с плавающей точкой литералы по умолчанию двойные и sh точнее.

+4

Да, 'double' точнее, чем' float'. Поэтому, когда вы конвертируете из 'double' в' float', вы можете потерять информацию. Таким образом, преобразование является явным. Не уверен, что есть еще что сказать ... –

+2

float не шире, чем двойной. Это наоборот. Изменить: о, вы удалили эту фразу из вопроса. – BalusC

+0

@mark_huffington ваша аналогия изображения хорошая, но ваш вывод неверен. Вы можете думать о двойном как изображение 100x100, а float - как изображение 50x50. Конечно, вы можете использовать оба изображения для хранения изображения одного и того же объекта, но 100x100 будет более подробным. Поэтому, если вы конвертируете его в 50x50, вы потеряете разрешение. Точно так же можно использовать float и double для представления числа с плавающей запятой, но double может сделать это более точно. –

ответ

4

Поскольку номера с плавающей запятой по умолчанию имеют тип double. Чтобы сделать его плавающим, добавьте F. Вы получаете ошибку в приведенном ниже присваивании:

float f = 3.4028235E38; 

потому что двойной, как больше точности, чем поплавок. Таким образом, возможна потеря точности.

I would have expected just the opposite as floating point literals are by default double and should be more precise.

Давайте проверим бинарное представление Вашего номера до двойной точности:

0x47EFFFFFE54DAFF8 = 01000111 11101111 11111111 11111111 
         11100101 01001101 10101111 11111000 

Теперь, поскольку float является одинарной точности 32-битное значение с плавающей точкой. Он не может хранить все двойные значения, которые представляют собой 64-битные значения с плавающей запятой с двойной точностью.

+0

@mark_huffington. Я собирался отредактировать. Проверь это сейчас. –

+1

«Литералы с плавающей запятой по умолчанию двойные», поэтому установка его на поплавок будет терять точность. Устанавливать его в double f = blahblah не будет. – doctorlove

Смежные вопросы