80-битные числа с плавающей запятой и субнормальные числа

Я пытаюсь преобразовать 80-битный расширенный прецизионный номер с плавающей запятой (в буфере) в double. Буфер в основном содержит содержимое регистра x87.

этот вопрос помогли, но не все знакомы со стандартом IEEE. Во всяком случае, я изо всех сил пытаюсь найти полезную информацию о субнормальных (или денормализованных) числах в 80-битном формате. Я знаю, что в отличие от float32 или float64 у него нет скрытого бита в мантиссе (нет подразумеваемое добавление 1.0), поэтому один из способов узнать, нормализуется ли число, - проверить, установлен ли самый высокий бит в мантиссе. Остается следующий вопрос:--5-->

из того, что Википедия говорит мне, float32 и float64 указывают на субнормальное число с (смещенным) показателем 0 и ненулевой мантиссой.

  • что это говорит мне в 80-битном поплавке?
  • может 80-разрядных поплавки с мантиссой
  • кроме того, могут ли 80-битные поплавки с показателем 0 даже иметь мантиссу >= 1.0?

EDIT: я думаю, вопрос сводится к:

могу ли я ожидать, что FPU санирует экспоненту и самый высокий бит мантиссы в регистрах x87?

если нет, то какое число должно привести к преобразованию? Должен ли я вообще игнорировать экспоненту в этом случае? Или это qNaN?

EDIT:

Я прочитал раздел FPU в руководстве Intel (руководство разработчика программного обеспечения Intel® 64 и IA-32 Architectures, Том 1: базовая архитектура), что было менее страшно, чем я предполагал. Как выясняется следующие значения: не определен:

  • экспонента == 0 + мантисса с высоким бит
  • экспонента != 0 + мантисса без высшего бит

это не упоминает, могут ли эти значения отображаться в дикой природе, или если они внутренне преобразованы. Поэтому я фактически отряхнул Ollydbg и вручную установил биты в регистрах x87. Я создал ST (0), чтобы содержать все биты, заданные в экспоненте, и мантиссу 0. Затем я заставил его выполнить

FSTP QWORD [ESP]
FLD QWORD [ESP]

значение, хранящееся в [ESP] был преобразован в сигнальный NaN. После FLD, ST(0) содержал тихую Нэн.

думаю, это ответ на мой вопрос. Я принял J-16 Сдизрешение, потому что это самое прямое решение (хотя оно явно не объясняет некоторые из более тонких деталей).

так или иначе, дело раскрыто. Благодарить всех.

2 ответов


попробовать SoftFloat библиотека, у нее есть floatx80_to_float32, floatx80_to_float64 и floatx80_to_float128. Определите родной формат, действуйте соответственно.


проблема с поиском информации о субнормальных 80-битных числах может заключаться в том, что 8087 не использует для них никакой специальной денормализации. Нашел это на странице MSDNs на введите float (C):

значения, перечисленные в этой таблице, применяются только к нормализованным числа с плавающей запятой; денормализованные числа с плавающей запятой имеют меньшее минимальное значение. обратите внимание, что номера, сохраненные в регистрах 80x87 всегда представлены в 80-битном нормализованная форма; номера могут быть только представлен в денормализованном виде при хранении в 32-разрядном или 64-разрядном переменные с плавающей запятой (переменные типа float и типа long).

редактировать

Это может быть верно для того, как Microsoft использует регистры FPUs. Найден еще один источник, указывающий на это:

типы данных FPU:

80X87 FPU обычно хранит значения в нормализованном формате. Когда число с плавающей запятой нормализуется, бит H. O. всегда один. В 32 и 64-битные форматы с плавающей запятой, 80x87 на самом деле не храните этот бит, 80x87 всегда предполагает, что он один. Следовательно, 32 и 64-битные числа с плавающей запятой всегда нормализованы. в расширенный прецизионный 80-битный формат с плавающей запятой, 80x87 не предположим, что H. O. бит мантиссы один, H. O. бит число появляется как часть строки биты.

нормированные значения обеспечивают наибольшую точность для заданного числа биты. Однако существует большое количество ненормализованных значений, которые мы можем представлять с 80-битным форматом. эти значения очень близки к нулю и представляют собой набор значений, чей бит мантиссы H. O. не является нуль. 80x87 FPUs поддерживают специальную форму 80 бит, известную как денормализованные значения.