我正在嘗試存儲不同位的最大和最小有符號整數。該代碼適用于 int64 以外的整數package mainimport ( "fmt" "math")func main() { var minInt8 int8 = -128 var maxInt8 int8 = 127 fmt.Println("int8\t->", minInt8, "to", maxInt8) fmt.Println("int8\t->", math.MinInt8, "to", math.MaxInt8) var minInt16 int16 = int16(math.Pow(-2, 15)) var maxInt16 int16 = int16(math.Pow(2, 15) - 1) fmt.Println("int16\t->", minInt16, "to", maxInt16) fmt.Println("int16\t->", math.MinInt16, "to", math.MaxInt16) var minInt32 int32 = int32(math.Pow(-2, 31)) var maxInt32 int32 = int32(math.Pow(2, 31) - 1) fmt.Println("int32\t->", minInt32, "to", maxInt32) fmt.Println("int32\t->", math.MinInt32, "to", math.MaxInt32) var minInt64 int64 = int64(math.Pow(-2, 63)) var maxInt64 int64 = int64(math.Pow(2, 63) - 1) // gives me the wrong output fmt.Println("int64\t->", minInt64, "to", maxInt64) fmt.Println("int64\t->", math.MinInt64, "to", math.MaxInt64)}輸出:int8 -> -128 to 127int8 -> -128 to 127int16 -> -32768 to 32767int16 -> -32768 to 32767int32 -> -2147483648 to 2147483647int32 -> -2147483648 to 2147483647int64 -> -9223372036854775808 to -9223372036854775808int64 -> -9223372036854775808 to 9223372036854775807我不知道這種行為的原因,我們將不勝感激。
1 回答

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