多个内部任务 - 它是如何工作的?

时间:2015-03-17 17:04:00

标签: c++ c algorithm micro-optimization

我正在尝试为了有趣的目的而做一个“1-liner”,由于某些原因我不能使代码正常工作。注意:这是C,而不是C ++,但问题仍然存在。

“展开”版本:

#include <stdio.h>
#include <math.h>

int main() {
    double iter = 1;
    double res = 0;
    double elem = 0;
    double fib_c = 1;
    double fib_p = 1;
    double power = 4;
    double fact = 1;

    while (iter < 15) {
        fib_c += fib_p; //fibonacci current
        fib_p = fib_c - fib_p; //fibonacci previous
        fact *= iter; //factorial
        power *= 4; //power of 4
        elem = (fib_c * power * sqrt(iter+1)) / fact; //element of series
        res += elem; //series

        printf("----\nelem = %2.3f\nres = %2.3f\n", elem, res);

        iter++;
    }

    return 0;
}

这是一个系列(我不知道英语中的数学术语),elem从45上升到1264,然后又下降到47.

这是我正在努力工作的“包装”版本:

#include <stdio.h>
#include <math.h>

int main() {
    double iter = 1;
    double res = 0;
    double elem = 0;
    double fib_c = 1;
    double fib_p = 1;
    double power = 4;
    double fact = 1;

    while (iter < 15) {
        res += (elem = (fib_c += ((fib_p = fib_c - fib_p)) * (power*=4) * sqrt(iter+1)) / (fact*=iter));

        printf("----\nelem = %2.3f\nres = %2.3f\n", elem, res);

        iter++;
    }

    return 0;
}

这里elem ent在小于5次迭代中超出整数。显然,有些事情是错的。但是什么?

顺便说一句,如果我每次迭代打印出每个值(fib_cpowerfact),我会看到正确的值(当前的斐波纳契数,4的幂,正在进行的因子,相应)。所以我猜测“在幕后”发生了一些奇怪的事情,我不知道如何管理它。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

(fib_c += ((fib_p = fib_c - fib_p))

不同
fib_c += fib_p; //fibonacci current
fib_p = fib_c - fib_p; //fibonacci previous

相同
fib_p = fib_c - fib_p; //fibonacci previous
fib_c += fib_p; //fibonacci current