Tôi đang làm việc với một loạt các đôi gọi là indata
(trong đống, phân bổ với malloc), và một đôi địa phương gọi là sum
.C nguyên tắc cơ bản: biến kép không bằng biểu thức kép?
Tôi đã viết hai hàm khác nhau để so sánh các giá trị trong indata
và nhận được các kết quả khác nhau. Cuối cùng tôi đã xác định rằng sự khác biệt là do một hàm sử dụng một biểu thức trong một phép thử có điều kiện và hàm kia sử dụng một biến cục bộ trong cùng một phép thử có điều kiện. Tôi mong đợi những điều này tương đương.
chức năng Mỹ Á sử dụng:
if (indata[i]+indata[j] > max) hi++;
và chức năng của tôi B sử dụng:
sum = indata[i]+indata[j];
if (sum>max) hi++;
Sau khi đi qua cùng một tập dữ liệu và max
, tôi kết thúc với giá trị khác nhau của hi
tùy thuộc vào chức năng tôi sử dụng. Tôi tin rằng hàm B là đúng, và hàm A là gây hiểu nhầm. Tương tự như vậy khi tôi thử đoạn mã bên dưới
sum = indata[i]+indata[j];
if ((indata[i]+indata[j]) != sum) etc.
điều kiện đó sẽ đánh giá là đúng.
Mặc dù tôi hiểu rằng các số dấu phẩy động không nhất thiết cung cấp biểu diễn chính xác, tại sao thay đổi biểu diễn chính xác khi được đánh giá dưới dạng biểu thức so với được lưu trữ trong một biến? Được khuyến cáo thực hành tốt nhất để luôn luôn đánh giá một biểu thức kép như thế này trước khi có điều kiện? Cảm ơn!
Về cơ bản, máy tính không thể đại diện cho các con số có tổng độ chính xác. Đọc về dấu chấm động. –
@iharob Ông thừa nhận rằng trong đoạn cuối của mình. Nhưng nó không giải thích tại sao nó khác nhau tùy thuộc vào việc bạn gán kết quả cho một biến. – Barmar
Điều này có được biên dịch cho x86 hoặc x86-64 không? – Dolda2000