【问题标题】:C++: Store large numbers in a float like PHP?C ++:将大量数字存储在像PHP这样的浮点数中?
【发布时间】:2011-04-17 09:43:07
【问题描述】:

在 PHP 中,如果您超过 INT_MAX,它会将其转换为浮点数,从而允许形成非常高的数字(也可以是非十进制数),这是否可以在 C++ 中执行,或者是它们存储的方式浮点数/双精度数不同?

我希望对大型阶乘进行基准测试的原因,但是像 80! 这样的东西对于无符号整数来说方式太大了..

【问题讨论】:

    标签: c++ types floating-point integer


    【解决方案1】:

    该语言不会为您进行切换,但具有 floatdouble 数据类型,它们通常分别是 32 位和 64 位 IEEE 浮点数。

    64 位双精度数的范围足以容纳 80!,但没有足够的精度来准确表示它。该语言没有内置任何东西可以做到这一点:您需要使用一个大整数库,例如GMP

    【讨论】:

      【解决方案2】:

      尝试使用 GMP 库或为 C++ 提供的其他几个 Big Integer 库。您还可以使用字符串操作来计算大阶乘。点击here查看算法及其解释。

      【讨论】:

        【解决方案3】:

        C++ 没有这种“自动转换”工具,即使你可以通过 intfloat 构建一个模仿这种行为的类(double 会更好,IIRC它可以让您获得多达 170 个!)私有字段和一些运算符重载黑魔法。

        无论如何,从整数到 fp,您将失去精度,因此,即使您可以达到更高的数字,您也不会准确地表示它们。实际上,如果您在 fp 字段中使用阶乘,通常您可以使用Stirling's approximation(但我知道在这种情况下它不适用,因为它是一个基准)。

        如果您想在不损失精度的情况下获得任意大的阶乘,通常的解决方案是使用一些 bigint 库;您可以使用 Google 轻松找到其中的几个。

        【讨论】:

          【解决方案4】:

          使用 bigint 库之一,它允许您以性能成本创建任意精度的整数。或者您必须编写自己的类来模拟 PHP 的混合浮点整数功能

          类似的东西

          class IntFloat {
             union {
                float fval;
                int ival;
              } val;
              bool foatUsed;
          
              public:
                setVal(float val)
                {
                  this->val.fval = val;
                  floatUsed = true;
                }
          
                setVal(int val)
                {
                  this->val.ival = val;
                  floatUsed = false;
                }
          
                 //additional code for getters, setters, operators etc
           }
          

          但是 PHP 所做的并不值得模仿。

          您可以在wikipedia 上找到大型 int 库列表

          PS:

          “或者它们存储浮点/双精度数字的方式不同?”

          是的,它是不同的。 C++ 直接以目标机器格式存储它们,而 PHP 使用中间表示(或字节码,或者在 PHP 操作码的情况下)。因此 PHP 在后台将数字转换为机器格式。

          【讨论】:

            【解决方案5】:

            如果精度足够并且您的编译器支持,您可以使用 __float128 (long double)。

            【讨论】:

              猜你喜欢
              • 2015-07-18
              • 1970-01-01
              • 1970-01-01
              • 2012-07-30
              • 1970-01-01
              • 1970-01-01
              • 2011-04-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多