Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Về kiểu float trong C

  1. #1
    Ngày gia nhập
    08 2010
    Bài viết
    88

    Mặc định Về kiểu float trong C

    Các bác cho e hỏi đoạn chương trình sau
    Code:
    #include<stdio.h>
    int main(){
    float a = 0.70;
    	if (a < 0.7)
    		printf("Hi\n");
    	else
    		printf("Hello\n");
    }
    Tại sao lại in ra "Hi" chứ không phải in ra "Hello". E đã debug thì thấy a được gán giá trị là 0.69999998. E không hiểu tại sao nó lại gán giá trị này mà không phải là 0.7.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    586

    Trích dẫn Nguyên bản được gửi bởi soldtheworld Xem bài viết
    Các bác cho e hỏi đoạn chương trình sau
    Code:
    #include<stdio.h>
    int main(){
    float a = 0.70;
    	if (a < 0.7)
    		printf("Hi\n");
    	else
    		printf("Hello\n");
    }
    Tại sao lại in ra "Hi" chứ không phải in ra "Hello". E đã debug thì thấy a được gán giá trị là 0.69999998. E không hiểu tại sao nó lại gán giá trị này mà không phải là 0.7.
    Số kiểu float, double cũng như nhiều kiểu khác, được viết bằng cơ số 2. Có nhiều số biểu diễn được chính xác và đơn giản bằng cơ số 10 nhưng không thể biểu diễn chính xác bằng cơ số 2 trong giới hạn độ chính xác của kiểu đã chọn. Số 0.7 là thí dụ. Trường hợp này, 0.7 được biên dịch thành một số gần nhất để thay thế, là 0.69999998 hay gì đó.

    Bạn hãy search trong diễn đàn theo từ khóa IEEE 754, sẽ thấy nhiều thảo luận chi tiết về chủ đề này.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    08 2010
    Bài viết
    88

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Số kiểu float, double cũng như nhiều kiểu khác, được viết bằng cơ số 2. Có nhiều số biểu diễn được chính xác và đơn giản bằng cơ số 10 nhưng không thể biểu diễn chính xác bằng cơ số 2 trong giới hạn độ chính xác của kiểu đã chọn. Số 0.7 là thí dụ. Trường hợp này, 0.7 được biên dịch thành một số gần nhất để thay thế, là 0.69999998 hay gì đó.

    Bạn hãy search trong diễn đàn theo từ khóa IEEE 754, sẽ thấy nhiều thảo luận chi tiết về chủ đề này.
    Cảm ơn bác nha. T đã xem lại chuẩn IEEE rồi. Thêm một thắc mắc nữa nhờ bác giải đáp. Nếu có khai báo int a=7; thì giá trị 7 kia nằm trong bộ nhớ cấp cho biến a. Vậy nếu tôi viết if (a>8) thì số 8 kia nằm ở đâu hả bác?

  4. #4
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    906

    Trích dẫn Nguyên bản được gửi bởi soldtheworld Xem bài viết
    Cảm ơn bác nha. T đã xem lại chuẩn IEEE rồi. Thêm một thắc mắc nữa nhờ bác giải đáp. Nếu có khai báo int a=7; thì giá trị 7 kia nằm trong bộ nhớ cấp cho biến a. Vậy nếu tôi viết if (a>8) thì số 8 kia nằm ở đâu hả bác?
    Số 8 đó nó được kết hợp trực tiếp trong mã máy của chương trình, mã máy của chương trình được HĐH nạp lên phân đoạn bộ nhớ nào đó nhờ bộ nạp (Loader). Bạn cứ xem như nó không nằm trên ngăn xếp cũng như không được cấp phát trên Heap.

    Đại khái thôi không chính xác vì lâu rồi không đụng ASM:
    mov eax, a ; chuyển giá trị từ bộ nhớ của a vào thanh ghi eax
    cmp eax, 8 ; so sánh thanh ghi với giá trị trực tiếp, các cờ của CPU sẻ dựng tuỳ kết quả so sánh
    JL label ; nhảy đến label xét theo tình huống cờ
    Đã được chỉnh sửa lần cuối bởi MHoang : 27-03-2020 lúc 11:06 PM.

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    586

    Mình cũng đồng ý với MHoang. Số 8 đó nằm trong mã máy.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn