【发布时间】:2020-02-16 04:50:56
【问题描述】:
我用第二个问题稍微修改了原始消息:
一位 C++ 专家建议我检查一下: https://en.cppreference.com/w/cpp/numeric/bit_cast
更好地理解double、memcpy和bit_cast (C++20)的表示。
在这里更具体地说,我试图理解为什么我们会从代码中得到这个结果:
constexpr std::uint64_t u64v2 = 0x3fe9000000000000ull;
constexpr auto f64v2 = std::bit_cast<double>(u64v2);
"f64::from_bits(0x3fe9000000000000u64) == 0.781250f64"
在此之前,我花时间研究了快速反平方根示例中提供的示例。
https://en.wikipedia.org/wiki/Fast_inverse_square_root#CITEREFGoldberg1991
我手动进行了微积分,结果我终于意识到在这种特定情况下会发生什么,指数为 8 位,尾数为 23 位。
但在我上面提到的bit_cast 的应用示例中,根据我的研究,指数似乎是 11 位,尾数是 52 位(双精度):
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
当我手工计算时,我发现
x = (1+Mx/L)*2^(Ex-B)
与
L=2^52 and Ex = 2*(2^9- 1) with the notations of
https://en.wikipedia.org/wiki/Fast_inverse_square_root#CITEREFGoldberg1991
我没有找到公布的 `0.781250 的结果。 也许我选择的指数和尾数不正确。 我不知道,但我真的很想了解会发生什么。
提前感谢您的解释,以帮助找到0.781250
第二个问题:请您检查我在下面提出的问题作为对评论的回复,因为即使我对第一个示例也有挑战。提前致谢
【问题讨论】:
标签: floating-point hex double precision fixed