-6

タスク - 三角形の内側または外側のポイント。小さな三角形と大きな三角形のヘロンの公式をチェックします。次に、それらの合計を比較します。関数「area」のバグである可能性が最も高いです。

 #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 1 0 0 2 2 0 3 は 1 を返す必要がありますが、0 を返します。私の悪い英語を申し訳ありません。

4

2 に答える 2

3

double を operator== と比較しようとしています。
計算は異なる場合があります。誤差マージンとしてイプシロン値を使用する必要があります。

const double Epsilon = 0.0001;
if (((s1+s2+s3) >= s4 - Epsilon) && ((s1+s2+s3) <= s4 + Epsilon))
{
}
于 2013-10-28T13:20:45.390 に答える
1

(s1+s2+s3) == s4コンピュータの世界でdouble/floatうまく動作することを期待すべきではありません。試す:

abs(s1 + s2 + s3 - s4) < Epsilon

ここで、Epsilon は目的の精度です。たとえば、アプリケーションに基づいて0.000010.011.0、さらにはそれ以上に設定します。10.0

--

「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」

于 2013-10-28T13:20:54.087 に答える