c++ 如何检查一个数字的不合理性[已关闭]

f5emj3cl  于 2022-12-27  发布在  其他
关注(0)|答案(5)|浏览(164)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

三年前关闭了。
Improve this question
如何检查一个数的无理性?我们输入一个无理数,并且只使用标准的std库。

hc2pp10m

hc2pp10m1#

所有的floating-point numbers都可以用x = significand × 2exponent的形式表示,其中significandexponent是整数,所有这样的数都是有理数,这就是为什么这个问题只有一个近似解。
一种可能的方法是将一个数展开为连分数。如果分母非常小或为零,则输入数近似为有理数。或者,如果所有分母都不小,则输入数近似为无理数。
大致想法:

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
}

我们应该考虑在is_rational()中幻数的最佳选择。

xghobddn

xghobddn2#

正如@Jabberwocky指出的,你无法用计算手段验证这个数字是否真的是无理数。
把它看作一个典型的学生作业,我最好的赌注是尝试通过除法来处理这个数字,而不创建一个无限循环。考虑使用Hurwitz's TheoremDirichlet's approximation theorem。无论哪种方式,你都必须为你的计算设置一些边界(你的精度),在你认为这个数字有多少位是无理数之后。

mfpqipee

mfpqipee3#

无理数是......嗯......无理数。这意味着你不能用数值来表示它们,这就是为什么我们用符号来表示它们(例如:π)。你能做的最多是一个近似值。例如:在Math.h中,Pi近似为long double。如果你想要更精确的东西,你可以使用字节数组来重新实现类似BigNum的东西,但它仍然是一个近似值。
我们输入一个无理数
如果你的问题是关于一个Input(cin),那么就把它当作一个字符串,然后做一个近似。

46scxncf

46scxncf4#

你必须先找到输入任意无理数的方法。对于一些“简单”的无理数,比如“sqrt(x)",你可以检查x是否是平方数。

lokaqttq

lokaqttq5#

计算机的内存量是有限的,有理数的数量是无限的,更重要的是,计算机无法存储的小数表达式太长的有理数的数量也是无限的(这对世界上的每台计算机都是一样的),这是因为只要在有理数中添加随机数字,就可以生成任意“长”的有理数。
计算机不可能真的处理(所有的)实数。据我所知,计算机唯一能做的事情就是在有限的精度下工作(尽管足够精确是非常有用的)。它们处理的所有数字都是有理数。
给定一个数,你唯一能要求计算机为你做的事情就是在足够的时间后计算出它的十进制表达式。你的计算机能做这件事的所有数都被称为可计算数集合。但是,即使是这个集合,与基数方面的真实的集合相比,也是“小”的。
因此,计算机没有办法决定一个数是否有理,因为它们所处理的数的概念太简单了,无法做到这一点。

相关问题