【问题标题】:Increase a double to the next closest value?将双倍增加到下一个最接近的值?
【发布时间】:2011-09-02 19:25:06
【问题描述】:

这不是现实项目的问题;我只是好奇。

我们可以使用递增运算符 (i++) 增加 int。您可以将此操作定义为:
这会将值最接近i的变量增加。在这种情况下,这只是 +1。

但我正在考虑根据 IEEE 754-2008 系统定义特定范围内可用的双精度值的数量。我将能够建立一个图表,在某些范围内展示这些数量,并查看它是如何减少的。

我想应该有一种按位方式将双精度值增加到比原始双精度值更大的最接近值。

我在Wikipedia 上发现的是这样的:

双精度示例

0x 3ff0 0000 0000 0000   = 1
0x 3ff0 0000 0000 0001   = 1.0000000000000002, the next higher number > 1
0x 3ff0 0000 0000 0002   = 1.0000000000000004

这里可以看到下一个更高的数字是通过增加二进制内容得到的。但我认为这不会继续有效,因为双重方案看起来像这样:

我认为当所有分数位都设置为1时,应该执行其他操作以使增加最小。

也许这个操作有名字?有趣的参考资料?
欢迎任何信息:D

谢谢

【问题讨论】:

  • 这个问题与所述语言完全无关。
  • 我知道,但是通过这种方式,您可以接触到人们。就个人而言,我一直在查看我喜欢的标签。

标签: floating-point bit-manipulation ieee-754


【解决方案1】:

这里可以看到下一个更高的数字是通过增加二进制内容得到的。但我认为这不会继续有效,因为双重方案看起来像这样:

[图片省略]

我认为当所有小数位都设置为 1 时,应该执行其他操作以使增加最小。

第一个近似值,是的,这确实有效。

考虑一个标准化的正数:这是一个值 m * 2e 其中 1 m m = 1.xxxxxxx(二进制)。存储值中省略了二进制小数点前的“1”,因此存储值的“小数”(或“尾数”或“有效数”)部分由小数点后的位组成。

假设小数部分只有 4 位,而不是 52:存储值 1111(二进制)表示在小数部分 m = 1.1111(二进制)。将其视为整数并递增它会得到0000 的小数部分并带有进位。

但是进位进入指数,它增加了它。没错:在1.1111 * 2e 之后,我们期望的下一个数字是10.0000,确实是1.0000 * 2e+1


我说的是“第一个近似值”...将表示形式转换为整数、递增并转换回双精度数,对于正标准化数确实很好。它也适用于正的非规范化数字(小于最小的规范化数字;它们的指数为 0,通常隐藏的位是显式的)。

如果你的整数表示也是符号大小,它适用于负数;通常不会。对于更典型的二进制补码,你必须减去一个来“增加”一个负双精度。

最后,你最终会溢出最大的归一化数并将指数递增到无穷大和 NaN 范围内。

有一篇有趣的文章涵盖了这个here

【讨论】:

    【解决方案2】:

    在C99中有nextafter(3)和朋友。

    如果您想手动完成,我认为最直接的做法是用一个整数表示有效数,一个整数表示指数。

    如果您要避免次正规并增加正数,当显着性达到 2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多