1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
這里有多個(gè)問題:
math.Pow
返回一個(gè)float64
。此類型不能用于表示此處嘗試計(jì)算所需的具有全精度的 64 位帶符號(hào)整數(shù)。引用自雙精度浮點(diǎn)格式
整數(shù)值的精度限制
從 ?2^53 到 2^53(?9,007,199,254,740,992 到 9,007,199,254,740,992)的整數(shù)可以精確表示
2^53 和 2^54 之間的整數(shù) = 18,014,398,509,481,984 四舍五入到 2 的倍數(shù)(偶數(shù))
2^54 和 2^55 之間的整數(shù) = 36,028,797,018,963,968 舍入為 4 的倍數(shù)
即使精度足夠(在 2^63 的特殊情況下也是如此),float64 的精度也不足以從 2^63 中減去 1。只需嘗試以下操作(這里使用 uint64,因?yàn)?signed int64 是不夠的):
uint64(math.Pow(2, 63)) // -> 9223372036854775808 uint64(math.Pow(2, 63)-1) // -> 9223372036854775808
先將值轉(zhuǎn)換為 uint64 然后再減去,但這只是因?yàn)?2^63 可以在 float64 中用完整的預(yù)定義表示,即使具有此大小的其他值不能:
uint64(math.Pow(2, 63))-1 // -> 9223372036854775807
- 1 回答
- 0 關(guān)注
- 259 瀏覽
添加回答
舉報(bào)