Tích lũy sai số

Trong máy tính, số thực được biểu diễn dưới dạng sai số nên nếu số phép tính là rất lớn thì sai số mắc phải cũng rất lớn. Nên các bạn đừng ngạc nhiên khi đọc đoạn chương trình sau.

Chương trình thực hiện tính tổng của 10 số k kiểu double.

Bài đọc thêm: Đừng đoán, hãy chạy thử chương trình sau

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

using namespace std;

int main(){
double k=0.1;

int check;
check = (1==(k+k+k+k+k+k+k+k+k+k));

double sum = k+k+k+k+k+k+k+k+k+k;
//check = (1==10*k);

cout << check;
printf("\n%0.16lf", sum);
}

3 Responses to “Tích lũy sai số”

  1. Hùng Anh Trịnh Says:

    Vấn đề ở đây là trong máy tính khi lưu trữ các số, nó lưu ở binnary (ai cũng biết) nên nảy sinh vấn đề.Giống như trong decimal ta không thể lưu chính xác 10/3 vậy(10 không chia hết cho 3).Trong binary cũng không thể lưu chính xác 1/10 vì 2 không chia hết 10.Hậu quả là khi cộng nhiều lần các số float ta không thể thu được kết quả chính xác(dùng double cũng chẳng giải quyết được bao nhiêu).Cách xử lý mình biết hiện giờ cũng chỉ là dùng exspilon thôi .:)

  2. Si Quang Le Says:

    không có phép so sánh “=” cho kiểu thực trong toán học cũng như trong computer (float hoặc double).
    epsilon chỉ là giải pháp tính thế chứ không giải quyết cho mọi trường hợp, ví dụ khi x và y rất lớn thì x-y không bao giờ tiến đến epsilon.

    Đối với kiểu thực thì phải biết chính xác giá trị của mình có để tìm giải pháp thích hợp.


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: