将 float / double 转换为 C++ 中的 IEEE754 表示形式

Sol*_*der 2 c++ ieee-754

试图弄清楚这是如何工作的,但我无法理解我所代表的内容。我知道我们分配一个unsigned long long因为它包含与float相同的位数。但我到底代表什么?

我最好的解释是,我们试图将 double 数字转换为 unsigned long long 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 << " ";
}
Run Code Online (Sandbox Code Playgroud)

}

Pas*_*uer 5

在大多数(但不是全部)平台上,floatdouble使用 IEEE 754 表示法来近似实数值。有关位的含义,请参见https://en.wikipedia.org/wiki/IEEE_754。简而言之,在 IEEE-754 64 位双精度数中,有一个符号位、一个 11 位指数和一个 52 位有效数(也称为尾数),以如下形式表示实数

\n
sign \xe2\x8b\x85 2^(exponent \xe2\x88\x92 1023) \xe2\x8b\x85 (1.0 + significand / 2^52)\n
Run Code Online (Sandbox Code Playgroud)\n

除此之外还有一些特殊情况(无穷大、NaN次正规数有符号零),但这就是基本思想。如果您正在寻找更深入的参考资料,Michael L. Overton 的《Numerical Computation with IEEE Floating Point Arithmetic》是一本很棒的书。

\n

*(unsigned long long int *)&d请注意,正如其他人评论的那样,取消引用是未定义的行为。如果您确实想将 double 的位转换为 64 位 int,一种安全的方法是通过 memcpy:

\n
uint64_t bits;\nstd::memcpy(&bits, &d, sizeof(d));\n
Run Code Online (Sandbox Code Playgroud)\n