(a - 0.0001)+ 0.0001不等于a的双精度a的最大指数

时间:2017-01-23 15:33:05

标签: floating-point double

假设我们在64位机器中使用双精度浮点运算。我想找到具有该指数的double a的最大指数

(a - 0.0001) + 0.0001 == a

false

我可以举出一些例子:a = 5.0e-14就是其中之一。在这种情况下

(a - 0.0001) + 0.0001 = 5.0000002510715291e-14

我正在使用C ++,如果相关的话。编译器gcc-4.8.4,没有优化。

背景:在一段代码中,我正在查看变量,首先向下移动0.0001进行一些计算,然后向上移动0.0001,目标是恢复原始值。这不是正确的方法。理想情况下,我会保存原始值并将其复制回来,而不是来回移动。开发人员希望浮点中的非关联性不会对其余代码产生任何重大影响。如果所有这些值都非常接近0.0,那么在我们的情况下就是如此。

部分答案:指数不大于-5的正数,即1.0e-5,都应该是例子。

Partial asnwer 2: 0.00022207040003564455也是一个示例,它的指数为-4。

还有更大的数字也是例子吗?

1 个答案:

答案 0 :(得分:1)

比较

首先,0.000050.0002之间的所有数字都会产生正确的结果;根据Sterbenz的定理,可以精确地表示减法的结果,并且因为输入是FP数,所以加法的结果也可以。

其次,所有大于0.0001 / (eps/2)的数字(eps所在的位数,在这种情况下,DBL_EPSILON将产生正确的结果,因为x-0.0001,然后将结果添加到0.0001,只是x。(不要对这个界限感到太兴奋,它就是数十亿美元。)

除此之外,你几乎没有可靠的不变量。舍入到浮点数的0.0001不是一个很好的数字:因为它不是2的幂,也不是将小的整数乘以2的幂的结果,它得到了很多它的尾数为1,与你的推理能力相混淆。最重要的是,浮点相等很少是尝试的有用的东西,

即使上面的结果也假设了两个重要的事情:一个(在第二个边界的情况下),FP模式是圆形到最近的,两个,所有计算都是以双精度执行的。第一个你几乎可以肯定地假设,除非你已经不遗余力地改变它,但是C ++标准允许表达式中的中间结果以比操作数更高的精度执行,这意味着左侧可能具有比右手侧更高的精度,并以更高的精度进行比较。这允许左手边有许多潜在的非零尾数位,右手边不可能达到。

归根结底,你可以假设关于满足或不满足你的等式的数字分组很少。