#c #float #ieee_754
Пусть дано 32-битное число unsigned int. Как определить, можно ли его представить во float? C числами размером до 23 бит я разобрался: они полностью влезают в мантиссу размером 23 бита. Но некоторые числа больше 23 бит тоже могут быть представлены точно. Как это определить?
Ответы
Ответ 1
Ответ обнаружился в Википедии: Положительные числа до 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, но это поведение кажется логичным, так как оно совпадает с поведением для меньших чисел.
Комментариев нет:
Отправить комментарий