Есть ли спецификация для смещения экспоненты с плавающей точкой?

Показатели IEEE с плавающей запятой хранятся в виде целых чисел без знака, используя предопределенное смещение показателя для смещения показателя.

Смещение экспоненты, по-видимому, постоянно равно numeric_limits<T>::max_exponent - 1 где T тип с плавающей запятой

У меня нет документации, подтверждающей, что это всегда так, и я, конечно, не имею представления о форматах с плавающей запятой, отличных от IEEE.

Это должно быть известно для таких функций, как:

Есть ли есть спецификация для этого, или я должен предположить numeric_limits<T>::max_exponent - 1?

5

Решение

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 делает.

3

Другие решения

Я думаю, что вы должны сделать предположение здесь.

Особенно, is_iec559 может быть falseв этом случае возможно (хотя и маловероятно), что показатель будет представлен совершенно иначе (например, в виде дополнения 2 вместо смещенного целого числа).

Другое представление показателя действительно очень маловероятно. Даже форматы мэйнфреймов VAX и IBM, хотя и явно отличающиеся от IEEE в других отношениях, все еще используют формат избыточного N для своих показателей.

1

По вопросам рекламы [email protected]