tôi đã thực hiện một thuật toán để tính toán các bản ghi trong tự nhiên C.đúp bằng 0 vấn đề trong 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;
}
Như đã trình bày bởi báo cáo kết quả in ấn, tmp làm bằng 0.0 cuối cùng, tuy nhiên, vòng lặp tiếp tục. Điều gì có thể gây ra điều này?
Tôi đang trên Fedora 14 amd64 và biên soạn với:
clang -lm -o taylor_ln taylor_ln.c
Ví dụ:
$ ./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...
Chà, bốn người có cùng câu trả lời cùng một lúc. – mgiuca
Hãy xem: http://stackoverflow.com/questions/4664662/understanding-floating-point-problems/4664784. Số điểm nổi có thể rất phức tạp nếu bạn không biết rõ chúng. –
@mgiuca: sau đó nó _must_ được quyền :-) – paxdiablo