Dev*_*Dev 2 floating-point precision double hex fixed
我用第二个问题稍微修改了原始消息:
一位 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);
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
第二个问题:请您检查我在下面提出的问题作为对评论的回复,因为即使我对第一个例子也有挑战。提前致谢
对于3fe9000000000000,第一位(零)是符号位,所以我们可以忽略它(它是正的)。
接下来的 11 位是011.1111.1110( 3fe),1022但会向下调整1023以处理负指数。因此-1,它为您提供, 或的乘数。2-10.5
尾数位是1001000..0(9000..0你的十六进制数的)。那些前四位等同于值0.5,0.25,0.0125和0.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?。