添加双精度值的逻辑
本文关键字:双精度 添加 | 更新日期: 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的常数。