Смещение экспоненты, по-видимому, постоянно равно numeric_limits<T>::max_exponent - 1
где T
тип с плавающей запятой
У меня нет документации, подтверждающей, что это всегда так, и я, конечно, не имею представления о форматах с плавающей запятой, отличных от IEEE.
Это должно быть известно для таких функций, как:
Есть ли C ++ есть спецификация для этого, или я должен предположить numeric_limits<T>::max_exponent - 1
?
C ++ не определяет смещение, и вам не нужно знать его, чтобы использовать frexp
, ilogb
, или же logb
, Все эти функции используют и возвращают математический показатель, а не смещенный показатель. (Однако для frexp
показатель степени масштабируется таким образом, чтобы значение значилось в [1/2, 1), а не в обычном IEEE-754 [1, 2).)1
Смещение требуется только в том случае, если вы работаете с внутренним представлением типа float, и в этом случае ваш код зависит от реализации. IEEE-754 определяет смещение 2К—п-1-1, где К ширина хранения в битах (например, 32 или 64) и п это точность в битах (число бит в математическом значении, например 24 или 53 для общего float
а также double
типов, что на единицу больше ширины поля, содержащего первичную кодировку Таким образом, для обычного 32-битного формата смещение равно 232-24-1-1 = 27-1 = 127. Реализации C ++ могут использовать форматы не-IEEE-754.
1 Если показатель степени отличается для frexp
а также ilogb
/logb
что значит сказать, что это математика или предвзятость? Ясно, что существует некоторая базовая точка, относительно которой измеряется показатель степени, так как это может быть беспристрастным? За frexp
, ilogb
, или же logb
результат для каждой функции зависит исключительно от значение числа. Вы получите тот же результат независимо от того, используете ли вы float
или же double
вариант frexp
, Только математическое значение имеет значение. Напротив, когда вы смотрите на внутреннее представление значения с плавающей запятой, показатель степени будет отличаться в зависимости от формат данных; float
имеет иной уклон, чем double
делает.
Я думаю, что вы должны сделать предположение здесь.
Особенно, is_iec559
может быть false
в этом случае возможно (хотя и маловероятно), что показатель будет представлен совершенно иначе (например, в виде дополнения 2 вместо смещенного целого числа).
Другое представление показателя действительно очень маловероятно. Даже форматы мэйнфреймов VAX и IBM, хотя и явно отличающиеся от IEEE в других отношениях, все еще используют формат избыточного N для своих показателей.