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