提问人:Dan 提问时间:4/7/2022 更新时间:4/7/2022 访问量:209
从 float 到 double 的 NaN 转换会更改其基础数据
NaN conversion from float to double changes its underlying data
问:
int main(){
unsigned int a = 2139156962;
float b = *(float*)&a; // nan(0xf1e2)
double c = (double)b; // nan canonicalization?
float d = (float)c; // nan(0x40f1e2), d != b
unsigned int e = *(int*)&d; // e != a
return 0;
}
NaN 值可以用许多不同的方式表示。如上例所示,将 的 NaN 值转换为 double 类型不会保留输入位模式,将其转换回浮点数不会返回与原始输入相同的值。nan(0xf1e2)
从这个链接中,我可以在 x64 上看到,似乎规范了 Qnan 输入?CVTSS2SD
符号位被保留,8 位指数 FFH 被 11 位指数 7FFH 取代,24 位有效数通过附加等于 0 的 29 位扩展到 53 位有效数。
因此,无论我们输入的 Qnan 位模式是什么,输出都会使用并且不会保留所有原始位?这是某种 NaN 规范化吗?0x7FF
如果是这样,那么这个答案可能并不完全准确?
浮点数可以提升为双倍,并且值保持不变。
我们的输出仍然是 NaN,但基础数据现在已更改,并且 .c != b
答: 暂无答案
评论
binary32
0x00400000
a=7f80f1e2 b=7f80f1e2 c=7ff81e3c40000000 d=7fc0f1e2 e=7fc0f1e2