2010-09-26 17 views
3

在PHP中,如果你高於INT_MAX,它會將它轉換爲浮點數,從而允許形成非常大的數字(非十進制數),這是可以在C++中完成的,或者它們存儲浮點數/雙精度數字不同?C++:將大量數據存儲在像PHP這樣的浮點數中?

爲什麼我希望標杆大階乘的原因,但一些諸如80!方式太大的無符號整數..

回答

2

語言不會使開關你,但有數據類型floatdouble,它們通常分別是32位和64位IEEE浮點數。

一個64位double有足夠的範圍80 !,但沒有足夠的精度來表示它的確切。該語言沒有內置的任何東西可以這樣做:您需要使用大整數庫,例如GMP

1

使用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將數字轉換爲機器格式。

1

嘗試使用GMP庫或爲C++提供了其他幾個Big Integer庫。您也可以使用字符串操作來計算大型因子。點擊here瞭解算法及其解釋。

1

C++不具備這樣的一種「自動鑄造」設施,即使你可以建立一類由具有int和模仿這種行爲float(一double甚至會更好,IIRC它可以讓你起牀到170!)私人領域和一些運營商超載黑魔法。

無論如何,從整數到fp,你將失去精度,所以即使你能達到更高的數字,你也不會完全代表它們。實際上,如果你在fp字段中使用階乘,通常可以使用Stirling's approximation(但我知道在這種情況下它不適用,因爲它是基準)。

如果你想得到任意大的因式分解而不失精度,通常的解決方案是使用一些bigint庫;您可以使用Google輕鬆找到其中的幾個。

0

如果精度足夠,且您的編譯器支持,則可以使用__float128(long double)。