Есть ли спецификация для смещения экспоненты с плавающей точкой? - PullRequest
0 голосов
/ 01 мая 2018

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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.

0 голосов
/ 01 мая 2018

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

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

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

...