30/09/2018, 18:45

Làm thế nào để so sánh 2 số thực trong c?

Mình có làm 1 bài tập kiểm tra xem điểm có thuộc tam giác không và ép điều kiện cuối là diện tích MAB+MAC+MBC=ABC mình làm đến cuối rồi cũng đúng rồi nhưg không sao so sánh được 2 thằng đó mà kết luận ai giúp mình cách giải quyết với

#include “stdafx.h”
#include<stdio.h>
#include<conio.h>
#include<math.h>

int main()
{
float x1, y1, x2, y2, x3, y3, xm, ym;
float s, smab, smac, smbc, sm;
float ab, bc, ac;
float ma, mb, mc;
float p, pmab, pmac, pmbc;

printf("Nhap toa do diem thu nhat : ");
scanf_s("%f%f", &x1, &y1);

printf("Nhap toa do diem thu hai : ");
scanf_s("%f%f", &x2, &y2);

printf("Nhap toa do diem thu ba : ");
scanf_s("%f%f", &x3, &y3);

printf("Nhap toa do diem M : ");
scanf_s("%f%f", &xm, &ym);

ab = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
bc = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));
ac = sqrt(pow(x3 - x1, 2) + pow(y3 - y1, 2));
p = (ab + bc + ac) / 2;
s = sqrt(p*(p - ab)*(p - bc)*(p - ac));

ma = sqrt(pow(xm - x1, 2) + pow(ym - y1, 2));
mb = sqrt(pow(xm - x2, 2) + pow(ym - y2, 2));
mc = sqrt(pow(xm - x3, 2) + pow(ym - y3, 2));

//mab
pmab = (ab + ma + mb) / 2;
smab = sqrt(pmab*(pmab - ab)*(pmab - mb)*(pmab - ma));

//mac
pmac = (ac + ma + mc) / 2;
smac = sqrt(pmac*(pmac - ac)*(pmac - ma)*(pmac - mc));								

//mbc
pmbc = (bc + mc + mb) / 2;
smbc = sqrt(pmbc*(pmbc - bc)*(pmbc - mb)*(pmbc - mc));

sm = smbc + smab + smac;

printf("%f
", sm);
printf("%f
", s);

if (sm==s)
{
	printf("M nam trong");
}
else
{
	printf("M nam ngoai");

}
_getch();
return 0;

}

Liêu Đức Mạnh viết 20:46 ngày 30/09/2018

1 kinh nghiệm của mình thì đôi lúc cái hàm pow nó bị sai kết quá. trong trường hợp của bạn, bạn có thể đặt breakpoint để debug xem nó sai như thế nào. Nếu không thì thử
if (sm-s==0)
else

Gió viết 20:45 ngày 30/09/2018

bool eq(double a,double b,double eps=1e-6){
return abs(a-b)< eps;

}

Mốc viết 20:49 ngày 30/09/2018

Bạn tìm hiểu thêm về epsilon nhé, nói đơn giản nó chỉ là một số thực đủ nhỏ do mình tự định nghĩa để xét xem hiệu 2 số (a - b) có bằng nhau không.

bool isAlmostEqual(double a, double b, double epsilon)
{
    return fabs(a - b) <= epsilon;
}

Source: http://www.learncpp.com/cpp-tutorial/35-relational-operators-comparisons/

Bưu Nguyễn viết 20:47 ngày 30/09/2018

Ok thank mọi người!!

Bài liên quan
0