我试图将80位扩展精度浮点数(在缓冲区中)转换为double.
缓冲区基本上包含x87寄存器的内容.
缓冲区基本上包含x87寄存器的内容.
This question帮助我开始,因为我并不熟悉IEEE标准.
无论如何,我很难找到80位格式的次正规(或非规范化)数字的有用信息.
我所知道的是,与float32或float64不同,它在尾数中没有隐藏位(没有隐含的1.0加法),因此知道数字是否规范化的一种方法是检查尾数中的最高位是否设置.这让我有以下问题:
根据维基百科告诉我的情况,float32和float64表示一个次正规数,其(偏置)指数为0,尾数为非零尾数.
>这在80位浮点数中告诉我什么?
>可以使用尾数<80的80位浮点数. 1.0甚至有一个非零指数?
>或者,指数为0的80位浮点数甚至可以使尾数> = 1.0?
编辑:我想这个问题归结为:
我可以期望FPU清理x87寄存器中的指数和最高尾数位吗?
如果不是,转换结果应该是什么类型的数字?在这种情况下我应该完全忽略指数吗?还是qNaN?
编辑:
我阅读了英特尔手册(英特尔®64和IA-32架构软件开发人员手册,第1卷:基础架构)中的FPU部分,这比我担心的要少.事实证明,未定义以下值:
> exponent == 0尾数,设置最高位
> exponent!= 0没有最高位设置的尾数
它没有提到这些值是否可以在野外出现,也不会在内部转换.
所以我实际上除了Ollydbg并手动设置x87寄存器中的位.
我制作了ST(0)来包含指数中设置的所有位和尾数为0.然后我让它执行
FSTP QWORD [ESP] FLD QWORD [ESP]
存储在[ESP]中的值被转换为信令NaN.
在FLD之后,ST(0)包含安静的NaN.
我猜这回答了我的问题.我接受了J-16 SDiZ的解决方案,因为它是最直接的解决方案(虽然它没有明确解释一些更精细的细节).
无论如何,案件解决了.谢谢大家.
解决方法
尝试
SoftFloat库,它有floatx80_to_float32,floatx80_to_float64和floatx80_to_float128.检测原生格式,相应地采取行动.