使用 float/double 除法比较可还原分数
comparing reducible fractions using float/double division
假设我有两个分数:a/b 和 c/d,其中 a、b、c、d 都是大于 0 的整数。使用以下函数检查它们是否相等是否安全?:
bool are_equal_fractions(int a, int b, int c, int d) {
return (static_cast<double>(a) / b == static_cast<double>(c) / d);
}
根据另一个问题:can I compare two fractions if both have denominator with power of 2当两个分母都是 2 的幂时我可以使用这种方法,但是更一般的情况呢?
虽然每个int都可以表示为double,但是很多int比不能精确表示,非常相似但略有不同的分数可能四舍五入到同一个double。
考虑 a=2147483647,b=2147483646,c=2147483646,d=2147483645。 2147483646/2147483645 的分母将是 5 的倍数,即使是最小值。 2147483647/2147483646的分母不是5的倍数,所以不相等
cout << are_equal_fractions(2147483647, 2147483646, 2147483646,
2147483645) << endl;
输出“1”。
一般来说,此模式中的相等分数表示:
(i+2)/(i+1) == (i+1)/i
i*(i+2) == (i+1)*(i+1)
i^2 + 2*i == i^2 + 2*i + 1
0 == 1
无解
遵循此模式的最小反例是are_equal_fractions(67114658,67114657,67114657,67114656)
。我不认为任何其他模式可以有更接近的非等比例,因此对于小于这种情况的值可能是安全的。
假设我有两个分数:a/b 和 c/d,其中 a、b、c、d 都是大于 0 的整数。使用以下函数检查它们是否相等是否安全?:
bool are_equal_fractions(int a, int b, int c, int d) {
return (static_cast<double>(a) / b == static_cast<double>(c) / d);
}
根据另一个问题:can I compare two fractions if both have denominator with power of 2当两个分母都是 2 的幂时我可以使用这种方法,但是更一般的情况呢?
虽然每个int都可以表示为double,但是很多int比不能精确表示,非常相似但略有不同的分数可能四舍五入到同一个double。
考虑 a=2147483647,b=2147483646,c=2147483646,d=2147483645。 2147483646/2147483645 的分母将是 5 的倍数,即使是最小值。 2147483647/2147483646的分母不是5的倍数,所以不相等
cout << are_equal_fractions(2147483647, 2147483646, 2147483646,
2147483645) << endl;
输出“1”。
一般来说,此模式中的相等分数表示:
(i+2)/(i+1) == (i+1)/i
i*(i+2) == (i+1)*(i+1)
i^2 + 2*i == i^2 + 2*i + 1
0 == 1
无解
遵循此模式的最小反例是are_equal_fractions(67114658,67114657,67114657,67114656)
。我不认为任何其他模式可以有更接近的非等比例,因此对于小于这种情况的值可能是安全的。