所以我有两个功能。一个函数检查给定的边是否形成一个直角三角形。问题是当我在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";
}
答案 0 :(得分:8)
浮点运算通常不会产生完全精确的结果,但==
会检查是否完全相等。不要比较a == b
,而是使用abs( a - b ) < precision_limit
。这基本上适用于所有语言的浮点运算。
这并不能解释为什么它会因3, 4, 5
而失败,但似乎有一个很多代码你没有向我们展示。在isRightTriangle
之前if
打印正在分析的数字是一个非常好的主意。
(顺便说一句,现在我看到你将整数传递给pow
。在这种情况下,只有非常大的数字才会出现不精确的结果,而precision_limit
至少会有一个。{1}}。 )
答案 1 :(得分:2)
正如其他人所提到的,您正在使用浮点值并期望得到准确的结果。由于您只是对数字进行平方(pow(x, 2)
),因此您应该将它们相乘。这通常比动力更快,即使对于花车也是如此,它适用于任何类型的数字。