2011-09-02 59 views
4

这不是一个真实项目的问题;我只是好奇。增加一倍到下一个最接近的值?

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

但我正在考虑根据IEEE 754-2008系统定义在特定范围内可用的double值的数量。我将能够设置一个图表来展示这些数量在一些范围内,并看看它是如何下降。

我想应该有一个按比例增加双倍到最接近的值比原来的双倍。

我在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 

在这里,你可以看到下一个更高的数目由增大的二进制内容获得。但我不认为这会继续工作,因为双方案是这样的:

enter image description here

我想别的东西应该执行,使当所有的分数位被设置为最小增幅一。

也许这个操作有一个名字?有趣的参考?
的任何信息都是欢迎:d

感谢

+0

这个问题与指定的语言完全没有关系。 – Puppy

+1

我知道,但这样,你会接触到人。就个人而言,我一直在看我的首选标签。 –

回答

4

这里划分显著,你可以看到一个较大编号是通过增加二进制内容而获得的。但我不认为这会继续工作,因为双方案是这样的:

[图片省略]

我认为,当所有的分数位设置别的东西应该执行,使最小增幅到一个。

第一次近似,是的,这个确实是的工作。

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

让我们想象仅存在4中的小数部分的比特,而不是52:所存储的值1111(二进制)表示分数部分 = 1.1111(二进制)。把它看作一个整数并递增它给出0000的一小部分带进位。

但进位进入指数,增加它。完全正确:在1.1111 * 2 e之后,我们预计的下一个数字是10.0000,这确实是1.0000 * 2 e + 1


我说:“第一近似” ......代表转换为整数,递增,并转换回双,并正正规化数很好地工作。它也适用于正的非正规化数(小于最小规格化数;它们的指数为0,通常隐藏的位是显式的)。

它适用于负数如果您的整数表示也符号大小;它通常不会。对于更典型的二进制补码,你必须减去一个来“增加”一个负双。最后,最终你会溢出最大的归一化数字,并将指数增加到无穷大和NaN范围。

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

2

在C99有nextafter(3)和朋友。

如果你想用手工来做,我认为最简单的方法是用一个整数来表示有效数和一个指数。

如果你是避免次归和递增正数,当显著达到2 < < 52则应该增加指数和2

相关问题