Floating point 如何证明f64::from_位(0x3FE900000000000 u64)==0.781250 f64

Floating point 如何证明f64::from_位(0x3FE900000000000 u64)==0.781250 f64,floating-point,hex,double,precision,fixed,Floating Point,Hex,Double,Precision,Fixed,我用第二个问题略微修改了原始消息: 一个C++专家向我建议说: 为了更好地理解double、memcpy和bit\u cast(C++20)的表示形式 在这里,更具体地说,我试图理解为什么我们会从代码中得到这样的结果: constexpr std::uint64_t u64v2 = 0x3fe9000000000000ull; constexpr auto f64v2 = std::bit_cast<double>(u64v2); 与 我没有找到公布的0.781

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

一个C++专家向我建议说:

为了更好地理解
double
memcpy
bit\u cast(C++20)
的表示形式

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

    constexpr std::uint64_t u64v2 = 0x3fe9000000000000ull;
    constexpr auto f64v2 = std::bit_cast<double>(u64v2);

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

提前感谢您的解释,帮助您查找
0.781250


第二个问题:请检查我在下面提出的问题,作为对评论的答复,因为即使是我对第一个示例也有疑问。提前感谢对于
3FE900000000000
,第一位(零)是符号位,因此我们可以忽略它(它是正数)

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

尾数位是
1001000..0
(十六进制数的
9000..0
)。前四位等于值
0.5
0.25
0.0125
0.0625
(每次减半)。由于只设置了第一位和第四位,因此得到
0.5+0.0625=0.5625

按照IEEE754的要求,将隐式
1
添加到该数字中,得到的基值为
1.5625
。将其乘以前面计算的乘数,可以得到:

1.5625 x 0.5 = 0.78125
这就是你获得价值的方式


更详细的信息可以在上找到,你可以试用,这是一个非常有用的工具,我自己制作了它的副本来处理双重精度(不幸的是,不是在网络上,它是一个用于桌面的Java应用程序)。这确实对我的理解有很大帮助

你可能还想看看我在IEEE754上给出的,特别包括


关于您在注释中提出的位模式,
0x4172f58bc000000
(您的状态应为
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

4-->1-->7-->2-->f-->5-->8-->b-->c-->(以下是您的号码以IEEE-745 DP格式排列的方式:

                  6    5          4         3         2         1         0
                  3 21098765432 1098765432109876543210987654321098765432109876543210
                  S ----E11---- ------------------------F52-------------------------
          Binary: 0 01111111110 1001000000000000000000000000000000000000000000000000
             Hex: 3FE9 0000 0000 0000
       Precision: DP
            Sign: Positive
        Exponent: -1 (Stored: 1022, Bias: 1023)
       Hex-float: +0x1.9p-1
           Value: +0.78125 (NORMAL)

非常感谢您的详细解释。我现在理解得更清楚了。我在计算偏差指数L时出错了。我取了
2^11-1
,而我应该取
2^10-1
。晚上好,我继续阅读页面并进行验证。似乎有错误?因为这是写的(第一个示例):19880124.000000f64.to_bits()==0x4172F58BC000000U64我手动验证,似乎它是错误的。这将是:12F58BC000000。您能确认我说的话或更正我并解释(如果我错了)? thanks@Dev,我在结尾添加了一个位,展示了如何实现特定的位模式。希望这能有所帮助。我的问题是相反的:如何从
19880124
中获得0x4172F58BC000000U64?谢谢。是的,另一种感觉对我来说很容易,就像我的第一个例子一样sent@Dev,YouTube上有很多好的视频,如果你搜索f或者
ieee754如何将十进制数转换为位模式
。它基本上是转换为二进制分数,然后归一化为二进制科学符号。
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
                  6    5          4         3         2         1         0
                  3 21098765432 1098765432109876543210987654321098765432109876543210
                  S ----E11---- ------------------------F52-------------------------
          Binary: 0 01111111110 1001000000000000000000000000000000000000000000000000
             Hex: 3FE9 0000 0000 0000
       Precision: DP
            Sign: Positive
        Exponent: -1 (Stored: 1022, Bias: 1023)
       Hex-float: +0x1.9p-1
           Value: +0.78125 (NORMAL)