C ++ не определяет смещение, и вам не нужно знать его, чтобы использовать frexp
, ilogb
или logb
. Все эти функции используют и возвращают математический показатель, а не смещенный показатель. (Однако для frexp
показатель степени масштабируется таким образом, что значение значится в [1/2, 1), а не в обычном IEEE-754 [1, 2).) 1
Смещение требуется только в том случае, если вы работаете с внутренним представлением типа float, и в этом случае ваш код зависит от реализации. IEEE-754 определяет смещение как 2 k - p -1 -1, где k - ширина хранения в битах ( такие как 32 или 64) и p - это точность в битах (число бит в математическом значении, например 24 или 53 для общих типов float
и double
, что является еще одним чем ширина поля, содержащего первичную кодировку Таким образом, для обычного 32-битного формата смещение составляет 2 32−24−1 −1 = 2 7 −1 = 127. Реализации C ++ могут использовать не-IEEE-754 форматы.
Примечание
1 Если показатель степени отличается для frexp
и ilogb
/ logb
, что значит сказать, что он математический или предвзятый? Очевидно, что существует некоторая базовая точка, относительно которой измеряется показатель степени, так как это может быть беспристрастным? Для frexp
, ilogb
или logb
результат для каждой функции зависит исключительно от значения от числа. Вы получите тот же результат независимо от того, используете ли вы float
или double
вариант frexp
. Только математическое значение имеет значение. Напротив, если вы посмотрите на внутреннее представление значения с плавающей запятой, показатель степени будет отличаться в зависимости от формата данных; float
имеет смещение, отличное от double
.