mec*_*ner 3 c++ floating-point
假设我有两个分数: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);
}
Run Code Online (Sandbox Code Playgroud)
根据另一个问题:我可以比较两个分数,如果两个分数都具有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;
Run Code Online (Sandbox Code Playgroud)
输出"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
Run Code Online (Sandbox Code Playgroud)
没有解决方案.
遵循这种模式的最小反例是are_equal_fractions(67114658,67114657,67114657,67114656).我不认为任何其他模式可能具有更接近的不等比率,因此对于低于此情况的值可能是安全的.