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

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

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

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

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

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

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

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

EDIT:

Я прочитал раздел 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 , потому что это наиболее прямолинейное решение (хотя оно и не объясняет некоторые мелкие детали в явном виде). ​​

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

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

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

3 голосов
/ 06 августа 2011

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

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

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

Вышесказанное может относиться к тому, как Microsoft использует регистры FPU. Найден другой источник, который указывает на это:

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

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

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

...