0

所以我有两个功能。一个函数检查给定的边是否形成直角三角形。问题是,当我在分类中调用 if-else 语句中的函数时,即使 isRightTriangle(sides) 的值为真,我总是得到“不是直角三角形”。

bool isRightTriangle(int sides[])
{
    std::sort(sides, sides+3);

    if((pow(sides[0],2) + pow(sides[1],2)) == pow(sides[2],2))
        return true;
    return false;
}

void classify(int sides[], ofstream &outfile)
{
    int largest(int []);
    void typeOfTriangle(int [], ofstream &);
    bool isRightTriangle(int []);

    outfile << "Largest Side: " << largest(sides) << endl;
    typeOfTriangle(sides,outfile);

    if(isRightTriangle(sides))
        outfile << "Right Triangle\n\n\n";
    else
        outfile << "Not a Right Triangle\n\n\n";
}
4

2 回答 2

8

浮点运算通常不会产生完全精确的结果,但会==检查是否完全相等。而不是比较a == b,使用abs( a - b ) < precision_limit. 这基本上适用于所有语言的浮点运算。

这并不能解释为什么它会失败3, 4, 5,但似乎有很多代码你没有向我们展示。将isRightTriangle它正在分析的数字打印在if.

(顺便说一句,现在我看到您正在将整数传递给pow。在这种情况下,不精确的结果只会出现在非常大的数字上,并且precision_limit至少会是一个。)

于 2013-08-02T01:07:36.723 回答
2

正如其他人所提到的,您正在使用浮点值并期望得到准确的结果。由于您只对数字 ( pow(x, 2)) 进行平方,因此您应该将它们相乘。这通常比 pow 快,即使对于浮点数也是如此,并且它适用于任何类型的数字。

于 2013-08-02T01:10:21.227 回答