【问题标题】:Floating point truncation vs rounding by hand浮点截断与手动舍入
【发布时间】:2011-09-14 18:18:56
【问题描述】:

我正在尝试使用 32 位寄存器将小数转换为浮点整数。到目前为止,我必须手动(铅笔和纸)完成此操作,我的号码是

1.11010110111100110100010011(base 2) x 2^26

现在我知道尾数只能存储 2^23 位,所以我需要展示使用四舍五入和不四舍五入的情况。我的问题是什么决定了舍入?我知道截断会导致这个

1.11010110111100110100010(base 2) x 2^23

是否舍入只是向右看,如果等于 1,则向上舍入为 1,如果等于 0,则向下舍入为 0?

如果数字是

1.11010110111100110100010111(base 2) x 2^26 where there is a one to the right?

如果 2^3 的位是 1,而 2^2(右侧)的位是 1,就像本例中一样

1.11010110111100110100011111(base 2) x 2^26

谢谢,我只是有点不清楚现阶段的四舍五入。

【问题讨论】:

  • 提示:二进制数的截断和四舍五入与小数一样。
  • 我想我的问题是,当四舍五入时,您是否只是在四舍五入时从左侧第 24 位位置向右看?如果是1,那么你四舍五入,如果是零,那么离开它?或者您是否必须查看其余部分以确定是否需要四舍五入@Paul R
  • @floating: 好的 - 好点 - 理论上你需要查看尽可能多的位来进行“正确”舍入,但实际上大多数硬件实现使用右边的 1 或 2 位来决定是否四舍五入。
  • 好的,这是有道理的,非常感谢@Paul R
  • 将双精度数 (IEEE 794) 与 2 的幂相乘时不进行舍入。只有指数增加。

标签: floating-point floating-accuracy


【解决方案1】:

二进制数的截断和四舍五入与对小数的操作非常相似。理论上,您需要查看尽可能多的位以进行“正确”舍入,但实际上大多数硬件实现使用右侧 1 或 2 位来确定是否进行舍入。

【讨论】:

    【解决方案2】:

    通常会舍入到最接近的可用有效数字。但是如果值正好在这两者之间,即如果你想去掉的最高位是 1 而其他的都是 0,那么有几个所谓的平局规则:

    • 截断(向 0)
    • 向上(朝向+无穷大)
    • 向下(朝向-无穷大)
    • 远离0
    • 庄家四舍五入(到最接近的偶数位更有效的数字)。

    应用哪个规则是必须定义的。 AFAIK,大多数 FPU 使用银行家的四舍五入作为默认值。

    在我们的例子中,你丢弃了 3 个二进制数字。 000 被简单截断; 001-011 总是向下取整; 101-111 总是向上取整,100 调用打破平局规则。如果这些规则的结果是四舍五入,则在结果中添加一个最低有效位,并在必要时进行相应的移位。

    在您的第一种情况下,您只需截断位,因为它们低于 100,但如果这是值

    1.11010110111100110100011111
    

    而你要删除 3 位,它首先被截断为

    1.11010110111100110100011
    

    但是因为你扔掉的比特是111,所以你四舍五入,所以你加1,它变成了

    1.11010110111100110100100
    

    IOW,最低位011变成100

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多