【问题标题】:What's the limit of long long int ?long long int 的限制是什么?
【发布时间】:2016-01-17 19:27:18
【问题描述】:

我发现 long long int 的数值限制不足。 C++ 中是否还有其他数字类型,例如 java 中的大整数?

我最近偶然发现了这个问题,不知道如何解决...... https://blog.codechef.com/2009/07/02/tutorial-for-small-factorials/

【问题讨论】:

  • 不,没有任何标准的 bigint 类型。有一些库支持这种做法。
  • C++ 有几个不同的“大整数”选项。也许看看这个:gmplib.org
  • 考虑doubledecimal
  • @Zdenek:如果long long int 太小,使用double 会有什么帮助?它只支持最大为 2^53 - 1 的所有整数(之后,您开始失去精度)---这小于 long long int 必须支持的最小值。这是假设 double 是 IEEE 64 位浮点格式(例如,它们可以是 32 位和非 IEEE)。此外,C 中没有 decimal 类型。
  • 您假设 OP 需要避免下溢。情况可能并非如此。任何浮点数都可以表示比整数更大的数字范围,这可能是他需要的。你当然是对的,64 位浮点数只有 53 位尾数。

标签: c++


【解决方案1】:

您可以使用 C++ 库 <boost/multiprecision/cpp_int.hpp> 解决此类问题。

例如:

#include <boost/multiprecision/cpp_int.hpp>
using boost::multiprecision::cpp_int;
using namespace std;
int main()
{
    cpp_int f = 1;
    for(int i = 1; i <= 100; i++)
        f *= i;
    cout << "100! = " << f << '\n';
}

这将给出输出

100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

想了解更多C++ boost库,可以参考herehere

【讨论】:

    【解决方案2】:

    类型名称 - long long

    字节 - 8

    值范围 - –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

    参考:Microsoft

    【讨论】:

    • OP 没有指定编译器。这取决于实现。
    【解决方案3】:

    unsigned long long int 是标准 C++ 中最大的整数类型 (它可以容纳从 0 到 18 446 744 073 709 551 615 的数字), 如果你想要更大的,你可能需要搜索一些这样的 bignum 库: http://www.ttmath.org/

    【讨论】:

    • 该标准没有说明它可以容纳的数字有多大(或多小)。这取决于实现,应使用std::numeric_limits&lt;unsigned long long&gt;::max() 进行验证
    • @Christophe - 标准确实要求每个整数类型覆盖最小范围。本质上,unsigned long long 必须至少为 64 位宽。
    • @PeteBecker 虽然这对于大多数实现来说都是正确的,但 C++ 3.9.1(pt.2 和 3)并不保证 64 位。您能否为此声明提供任何参考?
    • @Christophe 但是,unsigned long long int 仍然是可以存储的最大整数值
    • @Christophe - 这个“声明”来自 C11 标准,第 5.2.4.2.1 节。
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多