Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Xin cho hỏi về khắc phục sai số khi tính toán tren số thực

  1. #1
    Ngày gia nhập
    09 2008
    Bài viết
    2

    Mặc định Xin cho hỏi về khắc phục sai số khi tính toán tren số thực

    Các bạn xem đoạn code này

    C Code:
    1. #include<stdio.h>
    2. #include<math.h>
    3. void main()
    4. {
    5.     float i;
    6.     i=sqrt(2);
    7.     if(i*i==2) printf("dung");
    8.         else printf("sai");
    9. }

    Kết quả là sai.

    Cái này là sai số do làm tròn khi tính toán trên số thực .
    Vậy liệu mình có thể khắc phục được điều này không.
    Và sửa code như thế nào.Mong các cao thủ chỉ giúp.

    *Chú ý: Cho code vào thẻ tag code, xem hướng dẫ ở đây
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 11-10-2008 lúc 10:41 PM.

  2. #2
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Sai số là không tránh khỏi, vì kết quả được làm tròn sau khi tính.

    Để không sai số chỉ có cách đưa vào là số chính phương.

    Sửa code trên như sau:
    C Code:
    1. #include<stdio.h>
    2. #include<math.h>
    3. void main()
    4. {
    5.     float i;
    6.     i=sqrt(2);
    7.     if(ceil(i*i)==2) printf("dung");
    8.         else printf("sai");
    9. }

    * ceil(); là hàm làm tròn lên, floor(); là hàm làm tròn xuống.

    *Edit: Với điều kiện số đưa vào là số nguyên
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 11-10-2008 lúc 10:53 PM.

  3. #3
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Ngày xưa khi còn làm nhiều các bài tập mang tính tính toán nhiều khi đụng tới so sánh trên số thực mình thường define ra một hằng sô Epsilon với độ sai số chấp nhận được rồi khi cần so sánh bằng thì nếu mà 2 số cần so sánh thì làm coi như là nó bằng như ví dụ sau:

    C Code:
    1.  
    2. #include<stdio.h>
    3. #include<math.h>
    4.  
    5. #define EPSILON     0.000001  // 1/1000000.
    6.  
    7.  
    8. double myAbs(double a)
    9. {
    10.     if(a>0)
    11.         return a;
    12.     return -a;
    13. }
    14.  
    15. void main()
    16. {
    17.     float i;
    18.     i=sqrt(2);
    19.     if( myAbs(i*i - 2.0) <= EPSILON) // ne^'u mà tri. tuyêt ?o^'i cu?a 2 so^' ca^`n so sánh mà nho? ho+n giá tri. Epsilon thì ?u+o+.c cha^'p nha^.n là ba(`ng nhau.
    20.          printf("dung");
    21.     else
    22.          printf("sai");
    23. }
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 11-10-2008 lúc 11:45 PM.

Các đề tài tương tự

  1. am thanh khi click tren asp.net
    Gửi bởi tthanhlong294 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 07-11-2012, 10:11 AM
  2. Hiển thị hình ảnh của Fonder tren DataList
    Gửi bởi kimchungno1 trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 0
    Bài viết cuối: 05-08-2011, 07:47 AM
  3. Borland C++ Lỗi khong cai dc borland tren win 7
    Gửi bởi cuongy3u trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 06-04-2011, 08:16 PM
  4. Cần tìm patch vs 1 cho VS 2005 tren Win 7 x 64
    Gửi bởi trilan trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 04-11-2010, 09:45 PM
  5. Host wcf tren web ASP.NET?
    Gửi bởi caotv1d trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 1
    Bài viết cuối: 29-08-2010, 07:04 PM

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