if-else语句行为不正确

时间:2013-08-02 00:53:34

标签: c++ if-statement

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

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";
}

2 个答案:

答案 0 :(得分:8)

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

这并不能解释为什么它会因3, 4, 5而失败,但似乎有一个很多代码你没有向我们展示。在isRightTriangle之前if打印正在分析的数字是一个非常好的主意。

(顺便说一句,现在我看到你将整数传递给pow。在这种情况下,只有非常大的数字才会出现不精确的结果,而precision_limit至少会有一个。{1}}。 )

答案 1 :(得分:2)

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