C ++:将大数字存储在像PHP这样的浮点数中?

时间:2010-09-26 12:49:47

标签: c++ types floating-point integer

在PHP中,如果你超过INT_MAX它将把它作为一个浮点数转换,允许形成非常高的数字(也是非小数),这是可以用C ++做的还是这样的他们存储不同的浮点/双精度数?

我之所以希望对大型因子进行基准测试,但80!之类的东西方式对于无符号整数来说太大了。

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

使用bigint库之一,它允许您以性能成本创建任意精确的内联。或者你必须编写自己的类来模拟PHPs hybrid float-int功能

像这样的东西

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将数字转换为机器格式。

答案 2 :(得分:1)

尝试使用GMP库,或者为C ++提供了其他几个Big Integer库。您还可以使用字符串操作来计算大因子。单击here获取算法及其说明。

答案 3 :(得分:1)

C ++没有这种“自动转换”工具,即使你可以通过intfloatdouble来构建一个模仿这种行为的类。会更好,IIRC它可以让你达到170!)私人领域和一些运营商重载黑魔法。

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

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

答案 4 :(得分:0)

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