So sánh trả về kết quả không như mong muốn?

Xin chào, em có đoạn code để so sánh giữa hai hàm với nhau mặc dù chúng trả về cùng kết quả nhưng khi so sánh lại cho ra kết quả là không bằng nhau , tại sao lại cho ra kết quả như vậy ạ ?

#include<iostream>
#include <math.h>
using namespace std;

void tinh(double &xn, double &ketqua, double &N){
    xn = (N+1)/2;
	while(fabs(xn - ketqua) > 0.0001){
        ketqua = xn;
        xn = 0.5 * (xn + N/xn);
	}
}

int main(){
    double N, xn, ketqua;
	 cout<<"Nhap vao so muon tinh can bac hai : ";
    cin>>N;
	tinh(xn, ketqua, N);
	if(ketqua == sqrt(N))
		cout<<"Bang nhau voi ham pow(N, 0.5)"<<endl;
	else 
		cout<<"Khong bang nhau voi ham pow(N, 0.5)"<<endl;
	return 0;
}

So sánh 2 số thực không dùng toán tử == đâu bạn. Về bản chất, máy tính lưu số thực dưới dạng nhị phân 32 hoặc 64 bit, cho nên có 1 số bit bị mất dẫn đến sai số trong kết quả.

Bạn so sánh 2 số thực có rất gần nhau hay không thông qua 1 sai số epsilon (do bạn tự định nghĩa, có thể là 1e-6 đối với float và 1e-10 đối với double)

bool is_float_equal(float a, float b) {
    return abs(a - b) < 1e-6;
}
6 Likes

Đúng, HK boy nói rất chuẩn, ngay bài học nhập môn lập trình phải biết ngay là không có so sánh số thực, các kiến thức về việc máy tính làm việc với số như thế nào hình như phải học trước khi bắt tay học lập trình chứ nhỉ? Mình chả hiểu sao hồi ban đầu tự học thì mấy cái đó thấy mặc định biết (chắc là hay đọc mấy tài liệu dạng “người ta làm điều đó như thế nào?”) khi đọc sách về nhập môn lập trình thì rõ, nắm được tường tận hơn.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?