【问题标题】:How to check whether a huge floating point number is an integer?如何检查一个巨大的浮点数是否为整数?
【发布时间】:2011-08-07 05:43:00
【问题描述】:

我有一个非常大的浮点数(大约 20 位),我想检查它是否为整数。例如,如果我有一个像 154.0 这样的数字,那么它是一个整数,而 154.123123 不是一个整数。

我需要检查非常大的浮点数(20 位或更多),这意味着我不能先将其转换为 long long 数据类型并查看它们是否相同。请把我推向正确的方向。我只希望在 C/C++ 中得到答案。谢谢! :)

【问题讨论】:

    标签: c++ c floating-point type-conversion


    【解决方案1】:

    嗯,什么是“巨大”?如果从某种意义上说数字确实很大,即位数大于浮点数尾数可表示的数字,那么您的浮点数始终为整数。

    例如,IEEE 754 双精度格式有一个 52 位尾数,对于大约 16 个十进制数字来说已经足够了。如果您的数字有 20 位小数,那么任何将这些数字压缩成 double 的尝试都会导致四舍五入,从而有效地将您的数字变成“整数”。

    您提到您的数字太大而无法放入 long long 数据类型。如果您指的是 64 位 long long 数据类型,那么它自动意味着您的数字非常大,以至于当用典型的 double 类型表示时它们永远不会有任何小数部分,即它们将始终是“整数”如果由double 值表示。

    附:您是否正在使用带有超宽尾数的奇异浮点类型?

    【讨论】:

    • @AndreyT :这很有趣。这似乎也很明显。感谢您指出了这一点。 :) 这是否意味着无法存储尾数超过 15 位的浮点数?我宁愿不使用字符串,因为这会使算术运算变得复杂。有任何方法来完成我需要做的事情吗?
    • @Anubhav:你为什么需要这样做?什么样的应用需要20位以上的精度?
    • @Oli - 我需要检查一个非常大的数字(以双精度存储),它是否是一个正方形。我正在做的是计算它的平方根并检查它是否是一个整数。平方根本身非常大。这个问题有解决办法吗?
    • @Anubhav:这里的问题是,您的“非常大的数字”可能已经在您尝试取其平方根之前进行了四舍五入。一般来说,你最好为自己找到一个大整数库来做这种事情。
    • 是的,我想是的!我现在应该学习 GMP 库!仅供参考,这是我试图解决的 Project Euler 问题 94! :)
    【解决方案2】:

    只测试是否x == floor(x)

    【讨论】:

    • @Nawaz:它正在工作。由于我在回答中描述的原因,您测试的所有数字都是整数。
    • @Nawaz:你怎么知道你的第一个值可以精确地表示为long double
    • @Nawaz:然而,你传递的是“整数”。在您的 is_integer 函数中添加打印输出 d 以查看您真正传递的内容。看一看:ideone.com/vC1OG
    • @AndreyT:是的....我做到了。它打印其他东西......不再浮动......谢谢......
    • @Nawaz:不浮动?恰恰相反,它是典型的浮动。您的数字发生的情况与浮点数的情况完全相同:由于尾数的宽度有限,因此数字会四舍五入。
    猜你喜欢
    • 2013-02-25
    • 2011-08-13
    • 2023-03-14
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多