如何检查数字是否不合理

Geo*_*rge 2 c++

如何检查数字是否不合理?我们输入一个无理数,仅使用标准std库。

Evg*_*Evg 5

所有浮点数都可以以形式表示,其中和是整数。根据定义,所有这些数字都是合理的。这就是为什么这个问题只有一个近似的解决方案。x = significand × 2exponentsignificandexponent

一种可能的方法是将数字扩展为连续的分数。如果遇到非常小的分母或零分母,则输入数字近似为有理数。或者,更好的是,如果所有分母都不大,则该数字近似无理。

粗略的想法:

bool is_rational(double x) {
    x = std::abs(x);
    for (int i = 0; i < 20; ++i) {
        const auto a = std::floor(x);
        if (x - a < 1e-8)
            return true;
        x = 1 / (x - a);
    }
    return false;
}

int main() {
    std::cout << std::boolalpha;
    std::cout << is_rational(2019. / 9102.) << std::endl;  // Output: true
    std::cout << is_rational(std::sqrt(2)) << std::endl;   // Output: false
}
Run Code Online (Sandbox Code Playgroud)

人们应该考虑内部魔术数字的最佳选择is_rational()