在PHP中,如果你高於INT_MAX
,它會將它轉換爲浮點數,從而允許形成非常大的數字(非十進制數),這是可以在C++中完成的,或者它們存儲浮點數/雙精度數字不同?C++:將大量數據存儲在像PHP這樣的浮點數中?
爲什麼我希望標杆大階乘的原因,但一些諸如80!
是方式太大的無符號整數..
在PHP中,如果你高於INT_MAX
,它會將它轉換爲浮點數,從而允許形成非常大的數字(非十進制數),這是可以在C++中完成的,或者它們存儲浮點數/雙精度數字不同?C++:將大量數據存儲在像PHP這樣的浮點數中?
爲什麼我希望標杆大階乘的原因,但一些諸如80!
是方式太大的無符號整數..
語言不會使開關你,但有數據類型float
和double
,它們通常分別是32位和64位IEEE浮點數。
一個64位double有足夠的範圍80 !,但沒有足夠的精度來表示它的確切。該語言沒有內置的任何東西可以這樣做:您需要使用大整數庫,例如GMP。
使用bigint庫中的一個,它允許您在性能成本中創建任意精度整數。或者你必須寫自己的類來模擬PHP的混合浮動-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
PS發現大INT庫列表:「或者他們儲存浮點/雙精度數不同的方式」
是的,它是不同的。 C++直接以目標機器格式存儲它們,而PHP使用中間表示(或字節碼,或者PHP操作碼)。因此PHP將數字轉換爲機器格式。
嘗試使用GMP庫或爲C++提供了其他幾個Big Integer庫。您也可以使用字符串操作來計算大型因子。點擊here瞭解算法及其解釋。
C++不具備這樣的一種「自動鑄造」設施,即使你可以建立一類由具有int
和模仿這種行爲float
(一double
甚至會更好,IIRC它可以讓你起牀到170!)私人領域和一些運營商超載黑魔法。
無論如何,從整數到fp,你將失去精度,所以即使你能達到更高的數字,你也不會完全代表它們。實際上,如果你在fp字段中使用階乘,通常可以使用Stirling's approximation(但我知道在這種情況下它不適用,因爲它是基準)。
如果你想得到任意大的因式分解而不失精度,通常的解決方案是使用一些bigint庫;您可以使用Google輕鬆找到其中的幾個。
如果精度足夠,且您的編譯器支持,則可以使用__float128(long double)。