我真的很好奇双精度浮点数是如何存储的。
这些是我到目前为止所想到的。
但是,我不理解指数,指数偏差以及wikipedia page.
中的所有公式任何人都能解释一下这些东西是什么,它们是如何工作的,并最终逐步计算出实数?
答案 0 :(得分:2)
在页面下方查看公式:
除上述例外情况外,整个双精度数由下式描述:
( - 1)^符号* 2 ^(指数 - 偏见)* 1.mantissa
该公式表示对于非NAN,非INF,非零和非正规数字(我将忽略),您可以获取尾数中的位并在顶部添加隐含的1位。这使得尾数53位在1.0 ... 1.111111 ... 11(二进制)的范围内。要获得实际值,请将尾数乘以2指数的幂乘以偏差(1023),并根据符号位否定结果。数字1.0的无偏指数为零(即1.0 = 1.0 * 2 ^ 0),其偏差指数为1023(偏差仅加到指数)。所以,1.0将是sign = 1,exponent = 1023,尾数= 0(记住隐藏的尾数位)。
将它们全部放在十六进制中,值为0x3FF000000000 == 1.0。
答案 1 :(得分:0)
e
,使得fraction * 2^e
等于我想要展示的数字。一个例子(在单精度方面我写得更舒服=)):
如果我不得不rappresent -0.75我做:
- 二元版本将是-11 * 2^-2 = -1.1 * 2^-1
1
126 -> 01111110
所以我们有-0.75 = 1 01111110 10000000000000000000000
对于总和,您必须对齐指数,然后您可以对该分数求和。
对于乘法,你必须
答案 2 :(得分:0)
int main()
{
double num = 5643.0662;
int sign = 0;
int exponent = 1035;
int exponent_bias = 1023;
float mantissa = 0.0662;
double x = pow(-1,sign) * pow(2,(exponent - exponent_bias)) * (1+mantissa);
int y = num - x;
cout << "\nValue of x is : " << x << endl;
cout << "\nValue of y is : " << y << endl;
return 0;
}