C++ 点和三角形

C++ 点和三角形,c++,C++,任务-点的位置,三角形内部或外部。我检查了Heron关于小三角形和大三角形的公式。然后比较它们的总和。很可能是功能区中的错误 #include <iostream> #include <math.h> using namespace std; struct point { int x; int y; }; double length(point first, point second)

任务-点的位置,三角形内部或外部。我检查了Heron关于小三角形和大三角形的公式。然后比较它们的总和。很可能是功能区中的错误

 #include <iostream>
    #include <math.h>

    using namespace std;

    struct point
    {
        int x;
        int y;
    };

    double length(point first, point second)
    {
        double katet1=second.x-first.x;
        double katet2=second.y-first.y;
        return(sqrt(katet1*katet1+katet2*katet2));
    }

    double area(point a, point b, point c)
    {
        double ab = length(a,b);
        double bc = length(b,c);
        double ca = length(c,a);
        double p =(ab+bc+ca)/2;
        double s = sqrt(p*(p-ab)*(p-bc)*(p-ca));
        return(s);
    }

    int main()
    {
        int num;
        cin>>num;
        int win=0;
        for(int i=0; i<num; i++)
        {
            point d,a,b,c;
            cin>>d.x>>d.y>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y;
            double s1,s2,s3,s4;
            s1=area(d,a,b);
            s2=area(d,b,c);
            s3=area(d,a,c);
            s4=area(a,b,c);
            if((s1+s2+s3)==s4)
                        win++;
        }
        cout<<win;
        cin.get();
    }
没有通过所有测试。 例如,测试1 1 0 0 2 0 3必须返回1,但返回0。 怎么了?
对不起,我的英语不好。

您试图将double与operator==进行比较。 计算结果可能不同,您需要使用ε值作为错误裕度:

const double Epsilon = 0.0001;
if (((s1+s2+s3) >= s4 - Epsilon) && ((s1+s2+s3) <= s4 + Epsilon))
{
}
你们不应该期望s1+s2+s3==s4,因为double/float在计算机世界中运行良好。尝试:

abs(s1 + s2 + s3 - s4) < Epsilon
其中,Epsilon是您所需的精度,例如,根据您的应用程序将其设置为0.00001、0.01、1.0甚至超过10.0

-


您应该更具体地说明您的程序意外执行的操作。我假设它正在编译和运行,没有崩溃。与预期结果相比,您的一些结果是什么?您正在比较计算出的浮点数是否完全相等。这并没有真正起作用——而是使用一个公差阈值。查一下。如果你沿着这条路走,为什么不查一下abss1+s2+s3-s4呢?因为它不相关。它是一个标准的库宏,定义了1和大于1的最小可表示数之间的差异。浮点也有一个版本,叫做FLT_EPSILON。@H2CO3:DBL_EPSILON的公差太小了,除非你只处理明显小于1的值。你必须选择一个对你正在解决的问题来说足够好的公差,并且在你感兴趣的范围内,在类型的精度范围内。@MikeSeymour你认为DBL_EPSILON*maxa,b可以工作吗,例如?它的C++-y方式是。@H2CO3:这是一个合理的近似值,可以表示单个操作可能产生的错误,但可能仍然太小,无法用作公差。没有普遍的答案;为了计算出合理的公差,您必须了解该问题以及用于解决该问题的计算方法。