我怎么能证明 f64::from_bits(0x3fe9000000000000 u64 ) == 0.781250 f64

Dev*_*Dev 2 floating-point precision double hex fixed

我用第二个问题稍微修改了原始消息:

一位 C++ 专家建议我检查一下:https : //en.cppreference.com/w/cpp/numeric/bit_cast

更好地理解的表示doublememcpybit_cast (C++20)

更具体地说,我试图理解为什么我们从代码中得到这个结果:

    constexpr std::uint64_t u64v2 = 0x3fe9000000000000ull;
    constexpr auto f64v2 = std::bit_cast<double>(u64v2);
Run Code Online (Sandbox Code Playgroud)

"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)
Run Code Online (Sandbox Code Playgroud)

 L=2^52 and Ex = 2*(2^9- 1) with the notations of 
Run Code Online (Sandbox Code Playgroud)

https://en.wikipedia.org/wiki/Fast_inverse_square_root#CITEREFGoldberg1991

而且我没有找到宣布的 0.781250 的结果。也许我选择的指数和尾数不正确。我不知道,但我真的很想知道会发生什么。

在此先感谢您的解释,以帮助您找到 0.781250

第二个问题:请您检查我在下面提出的问题作为对评论的回复,因为即使我对第一个例子也有挑战。提前致谢

pax*_*blo 5

对于3fe9000000000000,第一位(零)是符号位,所以我们可以忽略它(它是正的)。

接下来的 11 位是011.1111.1110( 3fe),1022但会向下调整1023以处理负指数。因此-1,它为您提供, 或的乘数。2-10.5

尾数位是1001000..09000..0你的十六进制数的)。那些前四位等同于值0.50.250.01250.0625(每次减半)。由于只设置了第一个和第四个位,你得到0.5 + 0.0625 = 0.5625.

1按照 IEEE754 的要求,将隐式添加到该数字中,您将获得 的基值1.5625。当它乘以之前计算的乘数时,您会得到:

1.5625 x 0.5 = 0.78125
Run Code Online (Sandbox Code Playgroud)

所以这就是你获得价值的方式。


可以在IEEE754-1985 维基百科页面上找到更多详细信息,您可以尝试使用Harald Schmidt 出色的在线转换器,这是一个非常有用的工具,我构建了自己的副本来处理双精度(不幸的是,它不在网络上)是一个用于桌面的 Java 应用程序)。它确实我的理解有很大帮助。

您可能还想查看我在 IEEE754 上给出的其他一些答案,特别是这个答案


关于您在评论中提出的位模式0x4172f58bc0000000(您声明应该19880124但计算其他内容),这是您转换它的方式:

4---> 1--> 7-->   2--> f--> 5--> 8--> b--> c--> (<- hex digits)
s eee eeee eeee   mmmm mmmm mmmm mmmm mmmm mmmm
0 100 0001 0111   0010 1111 0101 1000 1011 1100 (<- then all zeroes)
  v      v  vvv     |  ||||  | | |    | || ||            1/n
  1      1  421     |  ||||  | | |    | || |+-------- 4,194,304
  0      6          |  ||||  | | |    | || +--------- 2,097,152
  2                 |  ||||  | | |    | |+----------- 1,048,576
  4                 |  ||||  | | |    | +------------   524,288
                    |  ||||  | | |    +--------------   131,072
                    |  ||||  | | +-------------------     8,192
                    |  ||||  | +---------------------     4,096
                    |  ||||  +-----------------------     1,024
                    |  |||+--------------------------       256
                    |  ||+---------------------------       128
                    |  |+----------------------------        64
                    |  +-----------------------------        32
                    +--------------------------------         8
Run Code Online (Sandbox Code Playgroud)

迹象是积极的。

指数是1,024 + 16 + 4 + 2 + 1 = 1,047 - 1,023 bias = 24,所以乘数是或。22416,777,216

尾数位总和,其中每个比特添加如在开始和向右增加:1/2nn1

1/4,194,304, , , , , , , , , , ,和 。1/2,078,1521/1,048,5761/524,2881/131,0721/8,1921/4,0961/2561/1281/641/321/8

当您将所有这些与隐式相加时1,您会得到1.1849477291107177734375.

然后,乘数与先前计算的乘数的乘积16,777,216就是您想要的值19,880,124?