如何存储和计算双精度浮点数?

时间:2012-02-04 15:15:40

标签: types numbers floating-point double

我真的很好奇双精度浮点数是如何存储的。

这些是我到目前为止所想到的。

        
  1. 内存需要64位
  2.     
  3. 由三部分组成         
                 
    • 符号位(1位长)
    •            
    • 指数(11位长)
    •            
    • 分数(53位,假设第一位始终为1,因此只存储52,除非所有52位都为0.然后假定前导位为0)
    •         
        
  4. 但是,我不理解指数,指数偏差以及wikipedia page.

    中的所有公式

    任何人都能解释一下这些东西是什么,它们是如何工作的,并最终逐步计算出实数?

3 个答案:

答案 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)

  • 签署:如果为负0,则为1
  • 分数:二进制模式中的循环浮动代表。
  • 指数:是指数e,使得fraction * 2^e等于我想要展示的数字。
  • 偏差是一个必须减去指数的数字才能得到正确的代表。双精度为1023,单精度为127。

一个例子(在单精度方面我写得更舒服=)): 如果我不得不rappresent -0.75我做:   - 二元版本将是-11 * 2^-2 = -1.1 * 2^-1

  • sign = 1
  • 分数= 1 + .1000 ....
  • 偏差指数:-1 + 127 = 126 -> 01111110

所以我们有-0.75 = 1 01111110 10000000000000000000000

对于总和,您必须对齐指数,然后您可以对该分数求和。

对于乘法,你必须

  • 将指数相加并减去偏差
  • 多重部分
  • 舍入结果
  • 查看标志(如果您有相同的标志,那么sign = 0 else sign = 1)

答案 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;
  }