【问题标题】:How double precision floating point number is stored and calculated?双精度浮点数如何存储和计算?
【发布时间】:2012-02-04 15:15:39
【问题描述】:

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

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

  1. 它们需要 64 位内存
  2. 由三部分组成
    • 符号位(1 位长)
    • 指数(11 位长)
    • 小数(53 位,假设第一位始终为 1,因此只存储 52 位,除非所有 52 位均为 0。然后假设前导位为 0)

但是我不明白什么是指数、指数偏差以及wikipedia page.中的所有这些公式

谁能解释一下所有这些东西是什么,它们是如何工作的,并最终逐步计算到实数?

【问题讨论】:

标签: types numbers floating-point double


【解决方案1】:

在页面下方查看公式:

除了上述例外,整个双精度数的描述如下:

(-1)^sign * 2^(exponent - bias) * 1.mantissa

该公式意味着对于非 NAN、非 INF、非零和非非正规数(我将忽略),您取尾数中的位并在顶部添加一个隐含的 1 位。这使得尾数为 53 位,范围为 1.0 ... 1.111111...11(二进制)。要获得实际值,请将尾数乘以 2 乘以指数的幂减去偏差 (1023),然后根据符号位对结果取反或不取反。数字 1.0 的无偏指数为零(即 1.0 = 1.0 * 2^0),其有偏指数为 1023(偏差只是添加到指数中)。所以,1.0 将是符号 = 1,指数 = 1023,尾数 = 0(记住隐藏的尾数位)。

将它们全部放在十六进制中,值将是 0x3FF000000000 == 1.0。

【讨论】:

  • 抱歉,我不明白您如何“[...] 将尾数乘以 2 的指数次方 [...]”。尾数是 1 和 0 的“刺”,指数也是。是否应该在前面加上类似“将尾数的二进制表示形式转换为十进制...”?
【解决方案2】:
  • 符号:如果为负,则为 1,如果为正,则为 0
  • 分数:二进制模式下的工程浮动表示。
  • 指数:是指数e 使得fraction * 2^e 等于我想要表示的数字。
  • 偏差是一个必须减去指数才能获得正确表示的数字。双精度为 1023,单精度为 127。

一个例子(在单精度下我写起来更舒服=): 如果我不得不说唱 -0.75 我会: - 二进制表示将是-11 * 2^-2 = -1.1 * 2^-1

  • 签名 = 1
  • 分数 = 1 + .1000....
  • 有偏指数:-1 + 127 = 126 -> 01111110

所以我们有-0.75 = 1 01111110 10000000000000000000000

对于总和,你必须对齐指数,然后你可以对小数部分求和。

对于乘法,你必须

  • 对指数求和并减去偏差
  • 将小数部分相乘
  • 对结果进行四舍五入
  • 看符号(如果符号相同,则符号 = 0,否则符号 = 1)

【讨论】:

    【解决方案3】:
        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;
      }
    

    【讨论】:

    • @please 如果此代码有错误,您想更正它,请填写并更正。
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多