Страницы

Поиск по вопросам

вторник, 6 ноября 2018 г.

Почему при записи большого числа во float меняются цифры на конце?

Записываю во float myVar число 0xBCA8F85D, если представить это число в десятичном виде в калькуляторе, получаю 3165190237, однако если вывести через printf("%f",a); результат 3165190144, объясните пожалуйста почему так происходит?


Ответ

Стандарт IEEE-754 описывает 32-битное число с точкой, как содержащее 1 бит знака, 8 бит экспоненты и 23 бита мантиссы. В частности, это означает, что точность хранимого числа "всего лишь" около 7 знаков, а разрешенный диапазон, около 10^38.
При записи числа, мантисса дает вам 23 бита на то чтобы записать число (от 1.0 до 2.0), а экспонента дает вам 8 знаков на то чтобы записать степень. При этом экспонента выбирается минимальной (для наибольшей точности по мантиссе). Возьмем простой пример по 2 бита - мантисса от 1 до 2 с шагом 0,25, а экспонента 1/2/4. Как нам записать в такое число 0.19 ? Никак, мы можем записать только максимально приближенное 1,5 ^ -4 и получим 0,197530864197530. Другой ближайший сосед будет .. (не знаю точно, но допустим) 0,1741254. И тогда что бы мы не ввели оно будет "округлено" до ближайшего представимого числа в нашем "float5".
Соответственно в вашем случае, полагаться можно только на первые 7 цифр - 3165190***, а последние три будут "как получится".
Зачем же нужен такой тип, если он даже не может вместить в себя int ? Затем, что в его особенности - его сила. Обычно при работе с числами не так важны мелкие значения на фоне больших. Работаете с миллиардами, не обращаете внимания на единицы. Работаете с миллиметрами - не важны нанометры.

Комментариев нет:

Отправить комментарий