在PHP中,如果你超过INT_MAX
它将把它作为一个浮点数转换,允许形成非常高的数字(也是非小数),这是可以用C ++做的还是这样的他们存储不同的浮点/双精度数?
我之所以希望对大型因子进行基准测试,但80!
之类的东西方式对于无符号整数来说太大了。
答案 0 :(得分:2)
该语言不会为您进行切换,但数据类型为float
和double
,通常分别为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 ++没有这种“自动转换”工具,即使你可以通过int
和float
(double
来构建一个模仿这种行为的类。会更好,IIRC它可以让你达到170!)私人领域和一些运营商重载黑魔法。
无论如何,从整数到fp,你将失去精确度,因此,即使你可以达到更高的数字,你也不会完全代表它们。实际上,如果你通常使用因子来fp字段,你可以使用Stirling's approximation(但我知道在这种情况下它不适用,因为它是一个基准)。
如果你想在不失精度的情况下获得任意大的因子,通常的解决方案是使用一些bigint库;您可以通过Google轻松找到其中的几个。
答案 4 :(得分:0)
如果精度足够且你的编译器支持它,你可以使用__float128(long double)。