80位浮点和次正规数

pez*_*ode 7 c++ floating-point ieee-754 x87

我试图将80位扩展精度浮点数(在缓冲区中)转换为double.缓冲区基本上包含x87寄存器的内容.

这个问题帮助我开始,因为我并不熟悉IEEE标准.无论如何,我很难找到80位格式的次正规(或非规范化)数字的有用信息.我所知道的是,与float32或float64不同,它在尾数中没有隐藏位(没有隐含的1.0加法),所以知道数字是否规范化的一种方法是检查尾数中的最高位是否设置.这让我有以下问题:

根据维基百科告诉我的情况,float32和float64表示一个次正规数,其(偏差)指数为0,尾数为非零尾数.

  • 这在80位浮点数中告诉我什么?
  • 尾数<1.0的80位浮点数是否可以具有非零指数?
  • 或者,指数为0的80位浮点数甚至可以使尾数> = 1.0?

编辑:我想这个问题归结为:

我可以期望FPU清理x87寄存器中的指数和最高尾数位吗?

如果不是,转换结果应该是什么类型的数字?在这种情况下,我应该完全忽略指数吗?还是qNaN?

编辑:

我阅读了英特尔手册(英特尔®64和IA-32架构软件开发人员手册,第1卷:基础架构)中的FPU部分,这比我担心的要少.事实证明,未定义以下值:

  • 指数== 0 +最高位设置的尾数
  • 指数!= 0 +没有最高位设置的尾数

它没有提到这些值是否可以在野外出现,也不会在内部转换.所以我实际上除了Ollydbg并手动设置x87寄存器中的位.我制作了ST(0)来包含指数中设置的所有位和尾数为0.然后我让它执行

FSTP QWORD [ESP]
FLD QWORD [ESP]
Run Code Online (Sandbox Code Playgroud)

存储的值[ESP]转换为信令NaN.之后FLD,ST(0)载着一个安静的NaN.

我猜这回答了我的问题.我接受了J-16 SDiZ的解决方案,因为它是最直接的解决方案(虽然它没有明确解释一些更精细的细节).

无论如何,案件解决了.谢谢大家.

J-1*_*DiZ 3

尝试SoftFloat库,它有floatx80_to_float32floatx80_to_float64floatx80_to_float128。检测本机格式,并采取相应措施。