试图弄清楚这是如何工作的,但我不能把我的头脑围绕在我所代表的东西上。据我所知,我们分配了一个,没有签名的长,因为它包含的位数与浮点数相同。但是i到底代表什么呢?
我最好的解释是,我们试图将双数转换为无符号长int,因为它们具有相同的位数。这样做的最佳方法似乎是取消我们设置的指针?
任何帮助都将不胜感激!
void printDouble(double d) {
unsigned long long int i = *(unsigned long long int *)&d;
for (int j = 63; j >= 0; j--) {
std::cout << ((i >> j) & 1);
if (j == 63) std::cout << " ";
else if (j == 52) std::cout << " ";
}}
发布于 2020-09-29 05:37:03
在大多数(但不是所有)平台上,float和double使用IEEE754表示来近似实数。有关位元的含义,请参见例如754。简单地说,在IEEE-754 64位双倍中,有一个符号位、一个11位指数和一个52位意义(也就是尾数)以如下形式表示实数:
sign ⋅ 2^(exponent − 1023) ⋅ (1.0 + significand / 2^52)除此之外还有一些特殊情况(无穷大、非数、亚法线、签名零),但这是基本思想。如果你在寻找更深层次的参考资料,一本很棒的书就是Michael L. Overton,“IEEE浮点算法的数值计算”。
注意,取消引用*(unsigned long long int *)&d是未定义的行为,正如其他人所评论的那样。如果你真的想把一个双比特变成一个64位的int,一个安全的方法就是通过memcpy:
uint64_t bits;
std::memcpy(&bits, &d, sizeof(d));https://stackoverflow.com/questions/64112903
复制相似问题