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

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

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

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

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

РЕДАКТИРОВАТЬ: Я предполагаю, что вопрос сводится к следующему:

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

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

РЕДАКТИРОВАТЬ:

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

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

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

FSTP QWORD [ESP]
FLD QWORD [ESP]

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

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

В любом случае, случай раскрыт. Спасибо всем.

7
задан Community 23 May 2017 в 11:52
поделиться