Я пытаюсь преобразовать 80-битное число с плавающей запятой расширенной точности (в буфере) в удвоение. Буфер в основном содержит содержимое регистра x87.
Этот вопрос помог мне начать работу, поскольку я не был хорошо знаком со стандартом IEEE. В любом случае, я изо всех сил пытаюсь найти полезную информацию о субнормальных (или денормализованных) числах в 80-битном формате. Я знаю, что в отличие от float32 или float64 у него нет скрытого бита в мантиссе (без подразумеваемого добавления 1.0), поэтому один из способов узнать, нормализовано ли число, - это проверить, установлен ли самый высокий бит в мантиссе. . Это оставляет меня со следующим вопросом:
Из того, что мне сообщает Википедия, float32 и float64 указывают субнормальное число с (смещенным) показателем 0 и ненулевой мантиссой.
РЕДАКТИРОВАТЬ: Я предполагаю, что вопрос сводится к следующему:
Могу ли я ожидать, что FPU очистит показатель степени и самый высокий бит мантиссы в регистрах x87?
Если нет, то в какое число должно привести преобразование? Должен ли я вообще игнорировать экспоненту в таком случае? Или это qNaN?
РЕДАКТИРОВАТЬ:
Я читал раздел FPU в руководстве Intel ( Руководство разработчика программного обеспечения Intel® 64 и IA-32, том 1: Базовая архитектура ), который был меньше страшнее, чем я боялся. Как оказалось, следующие значения не определены:
Не упоминается, могут ли эти значения появляться в «дикой природе» или преобразованы ли они внутренне. Так что я фактически очистил Ollydbg и вручную установил биты в регистрах x87. Я создал ST (0) так, чтобы он содержал все биты, установленные в экспоненте и мантиссе, равной 0. Затем я заставил его выполнить
FSTP QWORD [ESP]
FLD QWORD [ESP]
Значение, сохраненное в [ESP]
, было преобразовано в сигнальное NaN.
После FLD
, ST (0)
содержал тихий NaN.
Я думаю, это отвечает на мой вопрос. Я принял решение J-16 SDiZ , потому что это наиболее прямолинейное решение (хотя оно явно не объясняет некоторые более тонкие детали).
В любом случае, случай раскрыт. Спасибо всем.