如何检查一个双精度数是否可以被另一个双精度数整除?

问题描述 投票:0回答:1

我有两个任意双打。仅当一个双精度数除以另一个双精度数是整数时,代码才应继续,因此我无法真正将结果转换为双精度数。我可以进行正常的双除法,然后检查结果是否在指定整数的很小范围内,但这看起来相当混乱。

有人知道更好的解决方案吗?

c++ integer double division
1个回答
4
投票

要测试一个数字是否可以被另一个数字整除,可以使用

std::fmod
std::fmod
返回除法的余数。如果余数为零,那么这些数字一定可以被整除。

#include <cmath>
#include <limits>

constexpr double epsilon = std::numeric_limits<double>::epsilon();

constexpr bool divisible(double dividend, double divisor) {
    // exact match using "== 0" usually isn't safe
    return std::fabs(std::fmod(dividend, divisor)) < epsilon;
}

在某些情况下我们不能使用

std::fmod
,例如在常量表达式中(C++23 之前)。 作为解决方法,我们可以编写以下内容:

#include <cstdint>

constexpr bool divisible(double dividend, double divisor) {
    double quotient = dividend / divisor;
    double quotient_fraction = quotient - static_cast<std::intmax_t>(quotient);
    return quotient_fraction > -epsilon && quotient_fraction < epsilon;
}
© www.soinside.com 2019 - 2024. All rights reserved.