2011-08-27 16 views
1

我已經在C++中開發了我自己的BigInteger庫,爲了教學目的,最初我使用了base 10,它對加法,減法和乘法工作正常,但對於一些算法,如指數,模冪運算和劃分,似乎更多適當的使用基地2.什麼基地更適合我的BigInteger圖書館?

我想重新啓動我的項目從頭開始,我會知道你認爲什麼基地更充足,爲什麼?提前致謝!

+1

爲什麼自己寫的時候已經有GMP這樣的庫了:http://gmplib.org/ –

+1

*爲了教學目的*表明這是一個學習練習,所以在這種情況下重新實現輪子是有意義的。 –

回答

4

如果你看看大多數BigNum類型庫,你會發現它們是建立在現有的「SmallNum」數據類型之上的。由於很多原因,這些「SmallNum」數據類型(short,int,long,float,double,...)都是二進制數。如果使用(例如)unsigned int s的矢量,您的代碼將會更快(更快,更快!),而不是基數10位的矢量。

這是性能確實數不勝數的地方之一。假設您使用BigNum包來解決無需藉助BigNums即可解決的問題。即使是最好的BigNum庫也會比簡單的非BigNum方法慢得多(速度慢得多)。如果你試圖解決超出標準表示範圍的問題,那麼表現懲罰會使事情變得更糟。

克服這種內在損失的最好方法是儘可能地利用內建類型的優勢。

1

與您的目標機器上的單詞大小相同的基礎,您將單詞x word =雙字作爲基元。原始操作在機器指令方面整潔地工作。

1

對於BigDecimal類型,您需要精確地表示小數部分(對於財務計算等),基數10的表示形式纔有意義。

我無法看到使用BigInteger的基本10表示法的好處。它使得字符串轉換非常容易,但是以使數學運算複雜得多爲代價。在大多數情況下,這似乎不是一個好的權衡。