1 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
bignum庫通常將大數(shù)字存儲為數(shù)字序列(例如,以2 64為基數(shù))。它們的局限性與可用內(nèi)存有關(guān)。因此,您可以表示的最大數(shù)字取決于您的虛擬地址空間的限制。您可以安全地假設(shè)即使大到 10 10000的數(shù)字也可以用 bignum 表示。當(dāng)然,googolplex不能表示為 bignum(因?yàn)樗奈粩?shù)多于宇宙中的粒子數(shù))。
另一個(gè)限制是算術(shù)運(yùn)算的復(fù)雜性。但是存在非常有效的 bignum 算法。
FWIW,只要有內(nèi)存,GMPlib (bignums 的 C 庫)就可以處理數(shù)字。然而,有傳言說當(dāng)malloc
失敗時(shí),GMPlib 正在中止。
我不知道當(dāng)數(shù)字太大而無法表示時(shí) Go bignums 內(nèi)部會(huì)發(fā)生什么(并且該限制因一臺機(jī)器而異,并且可能因一次運(yùn)行而異)。例如,Go 的Int.Mul給出了一個(gè)乘積,其大小是參數(shù)大小的總和,并且“內(nèi)存不足”錯(cuò)誤沒有記錄(但顯然可能發(fā)生)。
使用 bignums 時(shí),更喜歡迭代算法而不是遞歸算法。例如,一個(gè)簡單的遞歸階乘可能會(huì)溢出足夠大的 bignums 的調(diào)用堆棧,所以你想迭代地編寫它。
- 1 回答
- 0 關(guān)注
- 274 瀏覽
添加回答
舉報(bào)