【问题标题】:How to perform round to even with floating point numbers如何使用浮点数执行舍入到偶数
【发布时间】:2012-02-17 09:49:24
【问题描述】:

关于 IEEE-754 单精度浮点,您如何执行四舍五入,在所需位置将四舍五入到最近的偶数位(默认和迄今为止最常见的模式)?

基本上我有保护位、圆形位和粘性位。 因此,如果我们将它们形成一个向量并将其称为 GRS,则适用以下规则:

  1. 如果G = 0,向下取整(什么都不做)
  2. 如果G = 1RS == 10RS == 01,则向上取整(尾数加一)
  3. 如果GSR = 111,则四舍五入

所以我不确定如何进行最接近的舍入。非常感谢任何帮助。

【问题讨论】:

    标签: binary floating-point rounding


    【解决方案1】:

    当您的一组位低于您保持的精度时,请考虑以下四舍五入:

    1. 如果您保留的最低有效位为 0,只需将 0x7ff....f 添加到舍入位。
    2. 如果您保留的最低有效位是 1,只需将 0x800....0 添加到舍入位。

    我认为这实现了只做一个测试的期望行为。

    【讨论】:

      【解决方案2】:

      只是想补充一点,S 位不仅仅是 GR 位之后的位。如果在 GRS 位之后有可用的位,它实际上是这些位的逻辑 OR,包括 S 位。
      换句话说,如果在 GR 位之后有任何位是 1,那么 S 位的值将是 1.

      【讨论】:

        【解决方案3】:

        为了确保我们在同一页上,G 是三个中的最高位,R 紧随其后,S 可以被认为是最低位,因为它的值部分代表在计算中被截断的更不重要的位。这三位仅在计算时使用,在计算前后不存储在浮点变量中。

        这是您应该执行的操作,以便使用 GRS 将结果四舍五入到最接近的偶数:

        GRS - 操作
        0xx - 向下舍入 = 不执行任何操作(x 表示任何位值,0 或 1)
        100 - 这是一个平局:如果尾数位刚好在 G 之前的位为 1,则向上取整,否则向下取整=什么都不做
        101 - 向上取整
        110 - 向上取整
        111 - 向上取整

        四舍五入是通过在尾数的最低有效位位置的尾数上加 1 来完成的,就在 G 之前。如果尾数溢出(您将存储的 23 个最低有效位变为零),您必须将 1 添加到指数。如果指数溢出,则根据数字的符号将数字设置为 +infinity 或 -infinity。

        在平局的情况下,如果尾数为奇数,则尾数加 1,如果尾数为偶数,则不加任何内容。这就是使结果四舍五入到最接近的偶数值的原因。

        【讨论】:

        • 你还需要圆形钻头吗?不能只看guard bit,sticky bit变成round和old sticky bit的OR吗?
        • 如果您不太关心舍入,则可以不使用这些位。它们只是帮助您获得更准确的结果。
        • 嗯,我很关心舍入,所以我的评论“你不能只看一下保护位,粘性位变成圆形和旧粘性位的 OR 吗?”有意义吗?
        • @inherithandle 例如,请参阅此 pageOn Rounding 部分。
        • @Veridian 你的观察“你不能只看一下保护位并且粘性位变成圆形和旧粘性位的 OR”在你提出的情况下是绝对正确的,而且确实不需要圆形位。 然而,在减法的情况下,当结果下溢并需要左移时,它是必需的。发生这种情况时,需要第三位来决定在平局情况下要做什么。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多