pez*_*ode 7 c++ floating-point ieee-754 x87
我试图将80位扩展精度浮点数(在缓冲区中)转换为double.缓冲区基本上包含x87寄存器的内容.
这个问题帮助我开始,因为我并不熟悉IEEE标准.无论如何,我很难找到80位格式的次正规(或非规范化)数字的有用信息.我所知道的是,与float32或float64不同,它在尾数中没有隐藏位(没有隐含的1.0加法),所以知道数字是否规范化的一种方法是检查尾数中的最高位是否设置.这让我有以下问题:
根据维基百科告诉我的情况,float32和float64表示一个次正规数,其(偏差)指数为0,尾数为非零尾数.
编辑:我想这个问题归结为:
我可以期望FPU清理x87寄存器中的指数和最高尾数位吗?
如果不是,转换结果应该是什么类型的数字?在这种情况下,我应该完全忽略指数吗?还是qNaN?
编辑:
我阅读了英特尔手册(英特尔®64和IA-32架构软件开发人员手册,第1卷:基础架构)中的FPU部分,这比我担心的要少.事实证明,未定义以下值:
它没有提到这些值是否可以在野外出现,也不会在内部转换.所以我实际上除了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的解决方案,因为它是最直接的解决方案(虽然它没有明确解释一些更精细的细节).
无论如何,案件解决了.谢谢大家.