我想用十六进制常量初始化一个双精度。
double dbl = 0xFEDCBA9876543212;
printf("dbl: %llX\n", (uint64_t)dbl);
我希望看到输出:
dbl: FEDCBA9876543212
但我得到了:
dbl: FEDCBA9876543000
为什么这是为什么最后3个字节被删除?
答案 0 :(得分:4)
您正在使用64位值初始化double,它只保存53个有效位。有一位四舍五入,其余的位只是丢失了。
答案 1 :(得分:2)
如果您只想进行memcpy样式交易,可以尝试:
uint64_t x = 0xFEDCBA9876543212;
double dbl = *reinterpret_cast<double *>(&x);
此外,您的测试可能没有做您想做的事情:
我的测试:
#include <cstdint>
#include <cstdio>
int main (void) {
// Move the underlying hex value through multiple types
uint64_t x = 0xFEDCBA9876543212;
double dbl = *reinterpret_cast<double *>(&x);
uint64_t y = *reinterpret_cast<uint64_t *>(&dbl);
// Check integrity of the result
printf("dbl: %llX\n", (uint64_t)dbl); //your test
printf("x: %llx\ny: %llx\n", x, y); //my test
return 0;
}
<强>输出:强>
dbl: 8000000000000000
x: fedcba9876543212
y: fedcba9876543212
如您所见,基础二进制值保持不变,从x
传递到dbl
到y
,即使您当前的测试printf("dbl: %llX\n", (uint64_t)dbl);
产生意外输出
答案 2 :(得分:1)
double
precision is 53 bits,这就是为什么你在剩余职位上获得零的原因。
答案 3 :(得分:1)
如果您想确切知道double的值,请使用hex的十六进制格式
0x1.01234567898abcp-12
然后在另一端汇编号码后,用printf("%p", number);
打印号码。如果您具有正确的位数,则该数字应与输入匹配。
答案 4 :(得分:0)
除了可接受的答案,您还可以使用联合体
union
{
long long _double_exact;
double _double;
};
double_exact = 0xFEDCBA9876543212;