Floating point 如何证明f64::from_位(0x3FE900000000000 u64)==0.781250 f64
我用第二个问题略微修改了原始消息: 一个C++专家向我建议说: 为了更好地理解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
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)