Страницы

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

суббота, 13 октября 2018 г.

Числа, которые могут быть представлены в типе float

Пусть дано 32-битное число unsigned int. Как определить, можно ли его представить во float? C числами размером до 23 бит я разобрался: они полностью влезают в мантиссу размером 23 бита. Но некоторые числа больше 23 бит тоже могут быть представлены точно. Как это определить?


Ответ

Ответ обнаружился в Википедии
Положительные числа до 2²⁴ включительно представляются точно Положительные числа от 2²⁴ + 1 до 2²⁵ округляются до кратного 2 Положительные числа от 2²⁵ + 1 до 2²⁶ округляются до кратного 4 ... Положительные числа от 2¹²⁶ + 1 до 2¹²⁶ округляются до кратного 2¹⁰³ Положительные числа от 2¹²⁷ + 1 до 2¹²⁸ − 2¹⁰⁴ округляются до кратного 2¹²⁷⁻²³ Положительные числа от 2¹²⁸ превращаются в бесконечность.
Аналогично для отрицательных чисел.

Округление производится в сторону ближайшего кратного. Для равноудалённых случаев используется «банковское» округление: 2²⁴ + 1 округляется вниз, 2²⁴ + 3 вверх, 2²⁴ + 5 снова вниз и т. д.

По поводу недостающего отрезка от 2¹²⁸ − 2¹⁰⁴ до 2¹²⁸ − 1: в моём эксперименте числа от 2¹²⁸ − 2¹⁰⁴ до 2¹²⁸ − 2¹⁰³ − 1 при превращении в float давали результат 2¹²⁸ − 2¹⁰⁴ (то есть, округлялись вниз до кратного 2¹²⁷⁻²³), а большие округлялись вверх (то есть до бесконечности).
Я не знаю, гарантировано ли это поведение стандартом IEEE 754, но это поведение кажется логичным, так как оно совпадает с поведением для меньших чисел.

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

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