下面示例中的 checkTriplet 函数将三角形的边长作为其参数,然后通过检查这三个数是否能组成一个 Pythagorean (毕达哥拉斯)三元组(直角三角形斜边长的平方等于其它两条边长的平方和。),从而计算出该三角形是否为直角三角形。 checkTriplet 函数调用另两个函数中的其中一个来进行实际测试。
请注意使用了非常小的数 (“epsilon”) 作为该测试的浮点数版本的一个测试变量。因为浮点数计算不精确和存在舍入误差,因此直接判断斜边的平方是否等于另两边的平方和是不实际的,除非已知该问题中的三个值都是整数。由于直接测试更精确,因此该示例中的代码先判断这个数是否适当,如果是,再使用。
var epsilon = 0.0000000000001; // 用于测试的非常小的数。
var triplet = false;
function integerCheck(a, b, c) { // 适用于整数的检验函数。
if ( (a*a) == ((b*b) + (c*c)) ) { // 具体的检验代码。
triplet = true;
}
} // 整数判别函数结束。
function floatCheck(a, b, c) { // 适用于浮点数的检验函数。
var theCheck = ((a*a) - ((b*b) + (c*c))) // 求检验数。
if (theCheck < 0) { // 判别需要使用绝对值,如果 theCheck 为负数,先转为相应的正数。
theCheck *= -1;
}
if (epsilon > theCheck) { // 如果足够接近非常小值,则可以认为满足条件!
triplet = true;
}
} // 浮点数判别函数结束。
function checkTriplet(a, b, c) { // 三元组判别函数。首先将最长边设为 "a"。
var d = 0; // 创建一个临时存放变量。
if (c > b) { // 如果 c 大于 b,两者进行交换。
d = c;
c = b;
b = d;
} // 否则无需操作。
if (b > a) { // 如果 b 大于 a,两者进行交换。
d = b;
b = a;
a = d;
} // 否则无需操作。
// 如果是直角三角形,则 "a" 边现在就是斜边。
if (((a%1) == 0) && ((b%1) == 0) && ((c%1) == 0)) { // 测试所有 3 个值是否均为整数?
integerCheck(a, b, c); // 如果是,则使用精确判别。
}
else
floatCheck(a, b, c); // 如果不是,则求最可能的结果。
} // 三元组判别函数结束。
// 下面三条语句指定示例值,以进行测试。
var sideA = 5;
var sideB = 5;
var sideC = Math.sqrt(50);
checkTriplet(sideA, sideB, sideC); // 调用该函数。在调用后, triplet 即包含了结果。