问题描述
我有两个任意双打。仅当一个双精度数除以另一个双精度数是整数时,代码才应继续。因此,我无法真正将结果转换为两倍。我可以进行普通的双除法,然后检查结果是否在指定整数的微小范围内,但这似乎很混乱。
有人知道更好的解决方案吗?
谢谢
解决方法
要测试一个整数是否可以被另一个整数整除,可以使用std::fmod
。 std::fmod
返回除法的余数。如果余数为零,则这些数字必须是可整除的。
#include <cmath>
constexpr double EPSILON = 1.0 / 1024 / 1024;
bool divisible(double dividend,double divisor) {
return std::fabs(std::fmod(dividend,divisor)) < EPSILON;
}
在某些情况下我们不能使用std::fmod
,例如在constexpr上下文中,因此我们也可以自己做数学:
#include <cstdint>
constexpr bool divisible(double dividend,double divisor) {
double quotient = dividend / divisor;
double quotient_fraction = quotient - static_cast<intmax_t>(quotient);
return quotient_fraction > -EPSILON && quotient_fraction < EPSILON;
}