Types 如何存储和计算双精度浮点数?
我真的很好奇双精度浮点数是如何存储的 这些都是我到目前为止发现的Types 如何存储和计算双精度浮点数?,types,numbers,floating-point,double,Types,Numbers,Floating Point,Double,我真的很好奇双精度浮点数是如何存储的 这些都是我到目前为止发现的 它们需要64位内存 由三部分组成 符号位(1位长) 指数(11位长) 分数(53位,假设第一位始终为1,因此仅存储52位,除非所有52位均为0。然后,假设前导位为0) 然而,我不理解什么是指数,指数偏差和所有这些公式 有人能告诉我这些东西是什么,它们是如何工作的,最终一步一步地计算出实数的吗?再往下看一页,看看公式: 除上述例外情况外,整个双精度数字如下所述: (-1)^符号*2^(指数偏差)*1.尾数 这个公式意味着,对于
- 符号位(1位长)
- 指数(11位长)
- 分数(53位,假设第一位始终为1,因此仅存储52位,除非所有52位均为0。然后,假设前导位为0)
有人能告诉我这些东西是什么,它们是如何工作的,最终一步一步地计算出实数的吗?再往下看一页,看看公式: 除上述例外情况外,整个双精度数字如下所述: (-1)^符号*2^(指数偏差)*1.尾数 这个公式意味着,对于非NAN、非INF、非零和非规范数(我将忽略这些),取尾数中的位,并在顶部添加一个隐式1位。这使得尾数在1.0范围内为53位。。。1.111111…11(二进制)。要获得实际值,将尾数乘以2,乘以指数的幂减去偏差(1023),然后根据符号位对结果求反或不求反。数字1.0的无偏指数为零(即1.0=1.0*2^0),其有偏指数为1023(偏差仅添加到指数中)。因此,1.0将是符号=1,指数=1023,尾数=0(记住隐藏的尾数) 以十六进制表示,所有这些值将为0x3FF000000000==1.0。
- 符号:1如果为负0如果为正
- 分数:在二进制模式下的工程化表示
- 指数:是指数
,使得e
等于我要显示的数字分数*2^e
- 偏差是一个必须减去指数才能得到正确表示的数字。在双精度中为1023,在单精度中为127
-11*2^-2=-1.1*2^-1
- 符号=
1
- 分数=1+0.1000
- 偏置指数:-1+127=
126->01111110
-0.75=101111110 100000000000000000000
对于求和,必须对齐指数,然后才能求分数部分的和
对于乘法,你必须
- 求指数和并减去偏差
- 分数部分的倍数
- 四舍五入结果
- 看这个符号(如果你有相同的符号,那么符号=0,否则符号=1)
int main()
{
双数=5643.0662;
int符号=0;
int指数=1035;
int指数_偏差=1023;
浮动尾数=0.0662;
双x=pow(-1,符号)*pow(2,(指数-指数偏差))*(1+尾数);
int y=num-x;
无法重复查看最佳答案。这是同样的事情,但尾数和指数的位数更大。答案和第一条注释的可能重复简要地解释了IEEE754的工作原理以及“实数”(精度)是如何工作的这里有两个不同的问题。我建议你从学习IEEE754浮点运算开始,然后看看上面的链接question@please如果此代码中有错误,您希望更正,请免费填写并更正。对不起,我不明白您如何“[…]将尾数乘以2乘以指数的幂[…]”。尾数是1和0的“sting”,指数也是如此。是否应该在前面加上类似“将尾数的二进制表示形式转换为十进制…”的内容?
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;
}