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

Types 如何存储和计算双精度浮点数?,types,numbers,floating-point,double,Types,Numbers,Floating Point,Double,我真的很好奇双精度浮点数是如何存储的 这些都是我到目前为止发现的 它们需要64位内存 由三部分组成 符号位(1位长) 指数(11位长) 分数(53位,假设第一位始终为1,因此仅存储52位,除非所有52位均为0。然后,假设前导位为0) 然而,我不理解什么是指数,指数偏差和所有这些公式 有人能告诉我这些东西是什么,它们是如何工作的,最终一步一步地计算出实数的吗?再往下看一页,看看公式: 除上述例外情况外,整个双精度数字如下所述: (-1)^符号*2^(指数偏差)*1.尾数 这个公式意味着,对于

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

这些都是我到目前为止发现的

  • 它们需要64位内存
  • 由三部分组成
    • 符号位(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
    一个示例(在单精度couse中,我更愿意编写=): 如果我必须给出-0.75,我会: -二进制表示将是
    -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;
      }