30/09/2018, 16:22

Cần 1 sự giải thích cho phép toán số thực

tình hình là em càng học càng thấy mình dốt ra. , và cái đơn giản càng lúc càng khó hiểu. nên lên đây nhờ các bác chỉ thêm.


#include<iostream>
using namespace std;
void main()
{
	double x = 1.123, y = 1.456;
	double z = 2.579;
	if (x + y == z)   // xét trường hợp x + y = z
	{ cout << " x + y = z " << endl;
	} 
	else  // trường hợp ngược lại, x + y khác z
	{
		cout << "x + y != z" << endl;
		cout << "x + y - z = " << x + y - z << endl;
	}
	double a = 1.125, b = 1.250;
	double c = 2.375;
	if (a + b == c) // xét trường hợp a+b = c
	{
		cout << " a + b = c" << endl;
	} 
	else      // ngược lại a + b khác c
	{ 
		cout << " a + b != c" << endl; 
	}
}

cái khó hiểu ở đây là phép tính ở trên, mình nhìn thấy bằng mà…tại sao nó không bằng…hixhixx, bức xức quá ,…mà khi trừ ra…nó lại bằng -4,44089x10-16 ( xấp xỉ gần bằng 0 ) ??? tại sao ???
các bác cắt nghĩa cho em nhé

buithaiminh viết 18:26 ngày 30/09/2018

Lỗi làm tròn số dấu chấm động nhị phân. (Lỗi do người dùng không hiểu rõ phép toán dấu chấm động, không phải lỗi IDE)
Google IEEE-754

nguyễn minh Tâm viết 18:33 ngày 30/09/2018

Bạn có thể giải thích rõ hơn 1 chút được không ? mình vẫn không hiểu ? tại sao là làm tròn số ?
x = 1.123 ; y = 1.456;
x + y = 2.579 ( bạn thử cộng lại xem có đúng không ? )

Minh Hoàng viết 18:34 ngày 30/09/2018

do cách lưu số thập phân dưới dạng nhị phân của máy tính đấy bạn, bạn có thể thử thêm các kiểu số thực như double sẽ thấy nó khác rất nhiều… bạn lên google tìm chuẩn IEEE-754 nhé
xem xong bạn có thể dự đoán so sánh x và y với khai báo như sau

double x=0.3;
float y=0.3;
Quân viết 18:36 ngày 30/09/2018

Như các bạn bên trên nói là đúng đó. Do sai số. Bạn thử chạy nhé.

#include <stdio.h>

int main(){
    double a = 1.2345, b = 2.3456;
    
    printf("a = %.20lf\n",a);
    printf("b = %.20lf\n",b);
    
    return 0;
}
Bài liên quan
0