Пусть дано 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, но это поведение кажется логичным, так как оно совпадает с поведением для меньших чисел.
Комментариев нет:
Отправить комментарий