添加双精度值的逻辑

本文关键字:双精度 添加 | 更新日期: 2023-09-27 18:31:11

我在一次采访中被问到了以下问题...

Compute the following sum:
1/2 + 1/4 + 1/8 + ... + 1/1048576    

有人告诉我这是一个逻辑问题,他们不是在寻找源代码,但我的答案如下......

    private static double computeSum(){
        double x = 0.0;
        for(double i=2; i<=1048576; i*=2){
            x += (1 / i);
        }
        return x;         
    }

这个问题的正确逻辑答案是什么?

添加双精度值的逻辑

我收到了这笔钱,我会说答案是1 minus the nth term,所以在你的情况下它是

1 - 1/1048576 = 1048575/1048576

我不会做任何数学或代码或任何东西。我想这就是他们正在寻找的答案。

我可能会通过说1/2 + 1/4 = 3/4 = 1 - 1/4;来显示一些"工作"//在此处编辑

1/2 + 1/4 + 1/8 = 7/8 = 1 - 1/8

总和:

1/2 + 1/4 + 1/8 + ... + 1/1048576

相当于:

(1 + 2 + ... 2 ^ 20) / (2 ^ 20) - 1 =
(2 ^ 21 - 1) / (2 ^ 20) - 1 =
2 - 1 / (2 ^ 20) - 1 =
1 - 1 / (2 ^ 20) ~= 0.99999

如果序列的长度增加,总和将趋向于一。

他们将分数加在一起,直到他们得出一个分数 1/1048576,该分数的值可以忽略不计。这意味着上述问题的答案将非常接近 1,但不完全是 1。

这是一个

简单的convergent geometric series

  s=a+ar+ar^2+ar^3+... to infinity

所以总和是

s=1/(1-r) where in this case r =1/2

但是,我们正在寻找 s-a,因为给定的序列从 1/2 而不是 1 开始。

s-a = 1/(1-r) - a = 1/(1-1/2) -1 = 1.

为什么他们称之为logic问题我不清楚,除了他们可能想要解释为什么给定的几何级数收敛 - 这是一个简单的证明:即任何两个连续项之间的比率是一个小于1的常数。