Đừng đoán, hãy chạy thử chương trình sau (Giải đáp: xem các comments ở dưới)

Đến giờ bạn phải cảnh giác với ngôn ngữ C++

Bạn hãy đoán và chạy thử xem dự đoán của bạn có chính xác hay không?

Nếu đề này cho vào tin đại cương thì mình cũng dính con 1 thôi :v . Hehe

(Giải đáp tại sao: Xem các comments phía dưới)

#include <iostream> 
#include <stdio.h>

using namespace std;

int main(){ 
    
    float k=0.1; 
    
    printf("k=%0.15f\n", k);
    printf("0.1=%0.15f\n", 0.1);
    
    if(k>0.1) printf("\nk>0.1"); 
        else printf("\nk<=0.1"); 
        

}

7 Responses to “Đừng đoán, hãy chạy thử chương trình sau (Giải đáp: xem các comments ở dưới)”

  1. tosonnguyen Says:

    Ta có thể sửa lại cho đúng bằng cách sử dụng so sánh sai số trong trường hợp này

    #include <iostream> 
    #include <stdio.h>
    #include <math.h>
    
    using namespace std;
    
    #define epsilon 1e-8
    
    int main(){ 
        
        float k=0.1; 
        
        printf("k=%0.15f\n", k);
        printf("0.1=%0.15f\n", 0.1);
        
        if(fabs(k-0.1) < epsilon) printf("\nk==0.1"); 
            else printf("\nk!=0.1"); 
            
    
    }
    
  2. tosonnguyen Says:

    Mình biết nó bị làm sao rồi:
    . k là kiểu float
    . 0.1 là kiểu double

    Nếu giờ bạn đổi k là kiểu double thì sẽ ra kết quả chính xác.

    Định dạng kiểu double là: %lf. double nghĩa là: Độ chính xác kép (tức độ chính xác gấp đôi kiểu float)

  3. tosonnguyen Says:
    #include <iostream> 
    #include <stdio.h>
    
    using namespace std;
    
    
    
    int main(){ 
        
        double k=0.1; 
        
        printf("k=%0.15lf\n", k);
        printf("0.1=%0.15lf\n", 0.1);
        
        if(k>0.1) printf("\nk>0.1"); 
            else printf("\nk<=0.1"); 
            
    
    }
    
  4. Nguyễn Khoa Ninh Says:

    Trước em cũng mắc phải lỗi này nhưng cũng chưa tìm được cách khắc phục hiệu quả, nếu xử lý bằng sai số thế này thì nhều chương trình như quản lý tiền cho cty nào đó e là sẽ phải đơn giản hóa thành số nhỏ hoặc tự xây dựng bộ xử lý số mới được

    • tosonnguyen Says:

      Anh vừa nói ở trên rồi đó. Nguyên nhân là do: k là kiểu float còn 0.1 là kiểu double. Muốn chạy đúng thì cho k là kiểu double là OK.

      Tuy nhiên, khi lập trình với số thực, có lẽ là tốt nhất chỉ nên sử dụng một kiểu thôi. Đó là kiểu double.

  5. Hùng Anh Trịnh Says:

    #include
    int main(){
    double k=0.1;
    printf((1==(k+k+k+k+k+k+k+k+k+k))?”Equal”:”Not equal”);
    }
    Let you try to explain the problem.There is 10 k numbers but they are not equal.🙂 .It’s sometime called “The pain of float number”.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: