greatxin

人从房间的一端走到另一端, 过程其实是每次都走剩下路程的一半, 这样无限循环下去, 按理来说是无解的. 但是看公式:
s = 1/2 + 1/4 + 1/8 + ...
两边同时乘以2:
2s = 1 + 1/2 + 1/4 + 1/8 + ...
第二个公式里有一项就是公式一, 拿公式一来替换得到:
2s = 1 + s
得出 s = 1;
神奇吧.
在程序里这样写的话会死循环, 因为没有终止的条件.
但是每个语言都是有精度的, 如果将当前计算相加的结果精度已经达到再加上更小粒度的数据都没有意义的时候, 那么也是一个判断跳出的条件:
s == s + term;
这里的term即使被循环了n次的值.
即 程序的精度已经无法计算出s + term 与 s值区别的时候.

int main()
{
    float s;
    float term = 0.5;
    while (s != s + term) {
        s = s + term;
        term /= 2;
    }
    printf("%f\n", s);
    return 0;
}

结果: 

分类:

技术点:

相关文章: