【发布时间】:2011-04-17 09:43:07
【问题描述】:
在 PHP 中,如果您超过 INT_MAX,它会将其转换为浮点数,从而允许形成非常高的数字(也可以是非十进制数),这是否可以在 C++ 中执行,或者是它们存储的方式浮点数/双精度数不同?
我希望对大型阶乘进行基准测试的原因,但是像 80! 这样的东西对于无符号整数来说方式太大了..
【问题讨论】:
标签: c++ types floating-point integer
在 PHP 中,如果您超过 INT_MAX,它会将其转换为浮点数,从而允许形成非常高的数字(也可以是非十进制数),这是否可以在 C++ 中执行,或者是它们存储的方式浮点数/双精度数不同?
我希望对大型阶乘进行基准测试的原因,但是像 80! 这样的东西对于无符号整数来说方式太大了..
【问题讨论】:
标签: c++ types floating-point integer
该语言不会为您进行切换,但具有 float 和 double 数据类型,它们通常分别是 32 位和 64 位 IEEE 浮点数。
64 位双精度数的范围足以容纳 80!,但没有足够的精度来准确表示它。该语言没有内置任何东西可以做到这一点:您需要使用一个大整数库,例如GMP。
【讨论】:
尝试使用 GMP 库或为 C++ 提供的其他几个 Big Integer 库。您还可以使用字符串操作来计算大阶乘。点击here查看算法及其解释。
【讨论】:
C++ 没有这种“自动转换”工具,即使你可以通过 int 和 float 构建一个模仿这种行为的类(double 会更好,IIRC它可以让您获得多达 170 个!)私有字段和一些运算符重载黑魔法。
无论如何,从整数到 fp,您将失去精度,因此,即使您可以达到更高的数字,您也不会准确地表示它们。实际上,如果您在 fp 字段中使用阶乘,通常您可以使用Stirling's approximation(但我知道在这种情况下它不适用,因为它是一个基准)。
如果您想在不损失精度的情况下获得任意大的阶乘,通常的解决方案是使用一些 bigint 库;您可以使用 Google 轻松找到其中的几个。
【讨论】:
使用 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 在后台将数字转换为机器格式。
【讨论】:
如果精度足够并且您的编译器支持,您可以使用 __float128 (long double)。
【讨论】: