【问题标题】:Fraction to right of radix - Floating point conversion小数右边的分数 - 浮点转换
【发布时间】:2014-01-01 14:26:16
【问题描述】:

当使用浮点位模型将数字从以 10 为底的数字转换为二进制时,是什么决定了您将小数“零填充”到小数点右侧多少个零?

以 -44.375 为例 这是我的系统编程课程中的一个测试问题,下面是教授为课堂提供的答案......我发布了这个,因为下面的大多数 cmets 似乎都在争论我的教授在答案中所说的内容并引起了一些混乱。

答案:1 1000 0100 0110 0011 0000 0000 0000 000 -- 符号位:1 -- 定点:-44.375 = 25 + 23 + 22 + 2-2 + 2 -3

           = 101100.011

          = 1.01100011 * 2<sup>5</sup>

--指数:5 + 127 = 132 = 1000 0100

-- 分数:0110 0011 0000 0000 0000 000

标记:

-- 正确符号位 1 分 -- 正确的定点表示得 2 分 -- 正确指数 2 分(二进制) -- 正确分数 2 分(用零填充)

【问题讨论】:

  • 请提供转换示例,以便更好地理解您的问题。
  • 我建议“指数:5 + 127 = 132 = 1000 0100”最好写成“偏差指数:真指数 + 偏差 = 5 + 127 = 132 = 1000 0100”。进一步“有效数=(1)+分数:(1)+ 0110 0011 0000 0000 0000 000”

标签: c model bits


【解决方案1】:

除非float 非常小,否则分数没有“零填充”。

这里的示例是 -1.63(十六进制)* 幂(2,5(十进制))。
调整指数直到前导数字为 1。

printf("%a\n", -44.375);
// -0x1.63p+5

[编辑]

您的教授希望看到“正确分数的 2 个标记(用零填充)”作为 float 中的位数,因此您示例中的有效数字是

1.0110 0011 0000 0000 0000 000

前导 1 没有显式存储在典型的 float 中。

OP“是什么决定了您将小数“零填充”到基数右侧的小数有多少个零?
答:IEEE 754 binary32(一种流行的float 实现)具有 24 位有效位。一个前导位(通常为 1)和一个 23 位小数。因此,您的“正确”零填充可以填充 23 个位置。

【讨论】:

    【解决方案2】:

    要确定 IEEE-754 32 位二进制浮点值的有效位:

    找出前导(最高有效)1 位的位置。那是起点。再计算 23 位。如果有任何剩余,将其四舍五入为 24 位中的最后一位(根据需要携带)。

    例外:如果前导位小于 2-126,则使用 2-126 位作为起点,即使它为零。

    这给出了数学有效数。要获取有效位字段的位,请删除第一位。 (并且,如果使用了异常,请将编码指数设置为零而不是正常值。)

    另一个例外:如果前导位在舍入后为 2128 或更大,则转换溢出。将结果设置为无穷大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多