我被實現算法中C.雙等於0問題用C
double taylor_ln(int z) {
double sum = 0.0;
double tmp = 1.0;
int i = 1;
while(tmp != 0.0) {
tmp = (1.0/i) * (pow(((z - 1.0)/(z + 1.0)), i));
printf("(1.0/%d) * (pow(((%d - 1.0)/(%d + 1.0)), %d)) = %f\n", i, z, z, i, tmp);
sum += tmp;
i += 2;
}
return sum * 2;
}
來計算自然對數。如圖所示由打印語句,TMP確實等於0.0最終,然而,循環繼續。什麼可能導致這個?
我在Fedora 14 AMD64和與編譯:
clang -lm -o taylor_ln taylor_ln.c
例子:
$ ./taylor_ln 2
(1.0/1) * (pow(((2 - 1.0)/(2 + 1.0)), 1)) = 0.333333
(1.0/3) * (pow(((2 - 1.0)/(2 + 1.0)), 3)) = 0.
(1.0/5) * (pow(((2 - 1.0)/(2 + 1.0)), 5)) = 0.000823
(1.0/7) * (pow(((2 - 1.0)/(2 + 1.0)), 7)) = 0.000065
(1.0/9) * (pow(((2 - 1.0)/(2 + 1.0)), 9)) = 0.000006
(1.0/11) * (pow(((2 - 1.0)/(2 + 1.0)), 11)) = 0.000001
(1.0/13) * (pow(((2 - 1.0)/(2 + 1.0)), 13)) = 0.000000
(1.0/15) * (pow(((2 - 1.0)/(2 + 1.0)), 15)) = 0.000000
(1.0/17) * (pow(((2 - 1.0)/(2 + 1.0)), 17)) = 0.000000
(1.0/19) * (pow(((2 - 1.0)/(2 + 1.0)), 19)) = 0.000000
(1.0/21) * (pow(((2 - 1.0)/(2 + 1.0)), 21)) = 0.000000
and so on...
哇,四個人在同一時間有相同的答案。 – mgiuca 2011-02-01 03:24:36
看看:http://stackoverflow.com/questions/4664662/understanding-floating-point-problems/4664784。如果你不瞭解它們,浮點數可能非常棘手。 – 2011-02-01 03:25:50