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