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

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

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

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

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

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


person Jonathan Mee    schedule 01.05.2018    source источник


Ответы (2)


C++ не определяет смещение, и вам не нужно знать его, чтобы использовать frexp, ilogb или logb. Все эти функции используют и возвращают математическую экспоненту, а не смещенную экспоненту. (Однако для frexp показатель степени масштабируется таким образом, что значение мантиссы находится в [1/2, 1), а не в обычном IEEE-754 [1, 2).)1

Вам нужно смещение, только если вы работаете с внутренним представлением поплавка, и в этом случае ваш код зависит от реализации. IEEE-754 определяет смещение как 2kp–1–1, где k – это ширина в битах (например, 32 или 64), а p – точность в битах (число битов в математической мантиссе, например 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.

person Eric Postpischil    schedule 01.05.2018

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

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

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

person Jerry Coffin    schedule 01.05.2018