Mang đến cho bạn hành trang là Kiến thức và Kinh nghiệm

Lựa chọn chủ đề bạn quan tâm

Cùng nhau thảo luận về các vấn đề

Hãy theo dõi chúng tôi nếu bạn thấy bổ ích

  1. Hỏi đáp IT
  2. Hỏi nhanh

[Help ]Liệu có phải compiler bị lỗi về so sánh ???

275 Lượt xem 6 Bình luận 0 Lượt báo xấu
Mình viết đoạn code sau trên CodeBlock( đã thử cả trên Dev C++)
#include<iostream>
using namespace std;
int main(){
float a;
cin>>a;
if(a<3.6) cout<< "NHO HON ";
else cout<< "LON HON BANG ";
return 0;
}

CHO NÓ RUN -> NHẬP 3.6 ->>> màn hình hiển thị: NHO HON ----> cái gì đang diễn ra vậy ????
<nếu thay 3.6 ở đoạn code trên thành 3.7 và cho chạy, nhập 3.7 thì lại ra LON HON BANG >
Thực sự thì là ntn vầy @@@ Con số 3.6 thần thánh quá à 
Câu trả lời

- Bạn đã sẵn sàng thảo luận về chủ đề này. Hãy bấm "Viết bình luận", bạn có thể lựa chọn sử dụng tài khoản Facebook hoặc Google++

- Vì sự phát triển của cộng đồng CNTT/CNPM tại Việt Nam!

Unknown user
No responses yet

Trong máy tính, số được biểu diễn dưới dạng nhị phân. Đối với số thực dấu chấm động (float, double) chỉ có các số là lũy thừa của 2, chẳng hạn 0.125, 0.25, 0.5, 1.0, 2.0, 4.0 mới được biểu diễn hoàn toàn chính xác mà thôi. Số 3.6 không phải là lũy thừa của 2 nên chỉ có thể biểu diễn gần đúng. Số 3.6 trong mã nguồn của bạn chỉ gần bằng 3.6 (nhưng khác 3.6) và số 3.6 mà bạn nhập vào khi chạy chương trình cũng thế. Hai số này xấp xỉ bằng 3.6 nhưng khác nhau bởi vì chúng có kiểu khác nhau.Trong máy tính, số được biểu diễn dưới dạng nhị phân. Đối với số thực dấu chấm động (float, double) chỉ có các số là lũy thừa của 2, chẳng hạn 0.125, 0.25, 0.5, 1.0, 2.0, 4.0 mới được biểu diễn hoàn toàn chính xác mà thôi. Số 3.6 không phải là lũy thừa của 2 nên chỉ có thể biểu diễn gần đúng. Số 3.6 trong mã nguồn của bạn chỉ gần bằng 3.6 (nhưng khác 3.6) và số 3.6 mà bạn nhập vào khi chạy chương trình cũng thế. Hai số này xấp xỉ bằng 3.6 nhưng khác nhau bởi vì chúng có kiểu khác nhau.
0 Lượt thích

Vậy tại sao khi mình khai báo trong code của mình, sửa float a; thành double a -> thì compiler lại chạy đúng như bình thường thế nhỉ????
0 Lượt thích

Khai báo lại biến a thành kiểu double thì chương trình chạy đúng, chứng tỏ số 3.6 trong mã nguồn của bạn được biểu diễn như một double

Và giải thích của mình cơ bản là giống như của bạn prog10: 3.6f là float, 3.6 là double.
0 Lượt thích

Vậy khi nào mình biết số mình nhập là trùng với compiler "hiểu" ??? Có cách gì để tối ưu việc này ?
0 Lượt thích

"Compiler cho kết quả đúng" ý bạn là khi chạy và nhập số 3.7, chương trình trả lời LON HON BANG?

Như vậy thì có gì lạ đâu. Trước đây, 3.6f < 3.6 (double). Còn bây giờ, 3.7f >= 3.7 (double). Tùy theo trị số, cả ba khả năng nhỏ hơn, lớn hơn và bằng nhau đều có thể xảy ra. Bạn có thể thu được 3.8f == 3.8 (double) (chú ý, ví dụ này hoàn toàn chỉ là giả định) nhưng cho dù như thế thì cả hai vế này vẫn khác 3.8 (tuyệt đối) khi 3.8 (tuyệt đối) không phải là một lũy thừa của 2, và như thế nghĩa là ngay cả trong trường hợp thứ ba này thì cách "hiểu" của compiler có thể vẫn khác với điều bạn muốn.

Cách giải quyết "tối ưu", để lập trình tính toán với các số thực một cách tin cậy, là bạn phải hiểu như compiler hiểu, như mình đã nói:

-- Trị số của trực kiện số dấu chấm động (floating-point literal) chỉ chính xác khi là lũy thừa của 2.

-- Khi bạn muốn biểu diễn điều kiện a == n, hãy cân nhắc viết là n - e/2 < a && a < n + e/2, trong đó e là một sai số nào đó mà bạn chấp nhận được, ví dụ, 1E-6.

EDIT: Nói thật đúng, các số dấu chấm động là bội nguyên của 2**n (** là lũy thừa) nhưng bản thân n lại được chọn tùy theo độ lớn của số được biểu diễn, nên nói chung khó biết khi nào thì một số được biểu diễn hoàn toàn chính xác. Ví dụ, mình nghĩ rằng 0.75 là chính xác, dù không phải là một lũy thừa của 2.
0 Lượt thích

Ok mình hiểu rồi cám ơn bạn ->>
0 Lượt thích

Từ khóa tìm kiếm

Câu trả lời mới nhất

Tin tuyển dụng