Диапазоны десятичного преобразования в спецификации IEEE 754 (двоичная арифметика с плавающей точкой)
В таблице 2 в разделе 5.6 в нижней части страницы 11 спецификации IEEE 754 перечислены диапазоны десятичных значений, для которых необходимо выполнить десятичное преобразование в двоичное с плавающей запятой. Диапазон показателей не имеет смысла для меня. Например, для двойной точности в таблице указано, что максимальное десятичное значение, которое может быть преобразовано, равно (1017-1) * 10999. Это намного больше, чем DBL_MAX, что составляет примерно 1,8 * 10308. Очевидно, я что-то упустил - кто-то может объяснить мне эту таблицу? Благодарю.
1 ответ
[Примечание: технически документ, на который вы ссылаетесь, больше не является стандартом; "IEEE 754" действительно должен использоваться только для обозначения обновленного издания стандарта, опубликованного в 2008 году.]
Насколько я понимаю, как вы говорите, левый столбец этой таблицы описывает диапазон допустимых входных данных для любой представленной десятичной строки в двоичное преобразование с плавающей запятой. Так, например, десятичная строка это что-то вроде '1.234e+879'
представляет значение 1234*10^876 (M = 1234, N = 876), поэтому находится в пределах таблицы и должно быть принято функциональностью преобразования. Хотя обратите внимание, что именно то, какую форму могут принимать десятичные строки, выходит за рамки IEEE 754; здесь важна только ценность.
Я не думаю, что проблема в том, что некоторые из разрешенных входных данных могут находиться за пределами представимого диапазона двойного числа; в этом случае должны соблюдаться обычные правила переполнения; см. раздел 7.3 документа. То есть исключение переполнения должно сигнализироваться, и при условии, что оно не перехвачено, результат преобразования (скажем, для положительного значения вне диапазона) является положительной бесконечностью, если режим округления округляется до ближайшего или округляется до положительной бесконечности и наибольшее конечное представимое значение, если режим округления округлен к отрицательной бесконечности или округлен к нулю.
Чуть более тонко, из моего прочтения этого документа, десятичная строка, такая как '1e+1000', также должна быть принята функцией преобразования, так как ее значение может быть выражено в виде 10 * 10^999 или даже 10000000000000000 * 10. ^984. См. Предложение, которое начинается с "При вводе, конечные нули должны добавляться или удаляться из M ..." в разделе 5.6.
Текущая версия IEEE 754, кажется, немного отличается в этом отношении, судя по общедоступной черновой версии ( версия 1.2.5): она просто требует, чтобы каждая реализация указывала границы [-η, η] для экспоненты десятичной дроби строка с η достаточно большой, чтобы вместить десятичные строки, соответствующие конечным двоичным значениям в наибольшем поддерживаемом двоичном формате; поэтому, если формат binary64 является самым большим поддерживаемым форматом, мне кажется, что η = 400 будет достаточно большим, например.