假设我们在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。
还有更大的数字也是例子吗?
答案 0 :(得分:1)
比较
首先,0.00005
和0.0002
之间的所有数字都会产生正确的结果;根据Sterbenz的定理,可以精确地表示减法的结果,并且因为输入是FP数,所以加法的结果也可以。
其次,所有大于0.0001 / (eps/2)
的数字(eps
所在的位数,在这种情况下,DBL_EPSILON
将产生正确的结果,因为x-0.0001
,然后将结果添加到0.0001
,只是x
。(不要对这个界限感到太兴奋,它就是数十亿美元。)
0.0001
不是一个很好的数字:因为它不是2的幂,也不是将小的整数乘以2的幂的结果,它得到了很多它的尾数为1,与你的推理能力相混淆。最重要的是,浮点相等很少是尝试的有用的东西,
即使上面的结果也假设了两个重要的事情:一个(在第二个边界的情况下),FP模式是圆形到最近的,两个,所有计算都是以双精度执行的。第一个你几乎可以肯定地假设,除非你已经不遗余力地改变它,但是C ++标准允许表达式中的中间结果以比操作数更高的精度执行,这意味着左侧可能具有比右手侧更高的精度,并以更高的精度进行比较。这允许左手边有许多潜在的非零尾数位,右手边不可能达到。
归根结底,你可以假设关于满足或不满足你的等式的数字分组很少。