Tôi không thể giải thích hành vi của chương trình sau (được biên dịch với gcc trên mingw 32 bit). Tôi nhận thức được sự mất mát chính xác có thể khi chuyển đổi hoàn toàn từ đôi thành int, nhưng tôi hy vọng hai trường hợp sẽ cho ra cùng một đầu ra vì nó đang thực hiện các phép toán tương tự. Tại sao hai đầu ra khác nhau?Đôi để int chuyển đổi tiềm ẩn trong mingw32
#include <stdio.h>
#include <math.h>
int main()
{
int table[3] = {2, 3, 4};
int i, N;
N = 0;
N += table[0] * pow(100, 0);
N += table[1] * pow(100, 1);
N += table[2] * pow(100, 2);
printf("%d\n", N);
N = 0;
for(i = 0; i < 3; i++)
N += table[i] * pow(100, i);
printf("%d\n", N);
return 0;
}
//output:
40302
40300
Tôi nghĩ rằng điều đáng nói đến là tiêu chuẩn C thực sự không chỉ định độ chính xác của "pow()", thậm chí không "pow()" phải đưa ra kết quả tương tự cho pow (0) và pow (i) với i = 0. Điều đó thực sự gây ngạc nhiên cho tôi nhưng có ý nghĩa để cho phép tối ưu hóa trên các hệ thống nhúng rất nhỏ. –