我在 Go 中測試了一些東西,注意到整數可以溢出,但float64顯然float32不能。f64 := math.MaxFloat64fmt.Printf("%f\n", f64)fmt.Printf("%f\n", f64+1)f32 := math.MaxFloat32fmt.Printf("%f\n", f32)fmt.Printf("%f\n", f32+1)i := math.MaxInt64fmt.Printf("%d\n", i)fmt.Printf("%d\n", i+1)結果:179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000340282346638528859811704183484516925440.000000340282346638528859811704183484516925440.0000009223372036854775807-9223372036854775808出于性能原因,顯然沒有檢查整數溢出,但為什么我不能讓浮點數溢出?他們被檢查了嗎?
1 回答

開滿天機
TA貢獻1786條經驗 獲得超13個贊
因為數據結構根本不同。大多數編程語言(包括 Go )用于(至少大部分)其整數數據類型的二進制補碼結構作為其工作方式的副產品溢出;大多數編程語言(包括 Go)用于(至少大部分)其浮點數據類型的IEEE-754 浮點不會溢出,它的工作方式數字的大小只會繼續增加,并且一旦過去某個點,即使在整數級別,數字也開始失去精度。
只是將數字數據存儲在一組固定大小的位中的兩種機制的工作方式根本不同。
還有其他結構。例如,某些語言具有不固定大小的“大整數”和/或“大十進制”類型;相反,它們占用了存放該號碼所需的空間。(Java 的BigInteger
和BigDecimal
,JavaScript 的BigInt
,...)Go在包Int
中有,Rat
和。(謝謝阿德里安!)固定大小的非常有用,因為它們非常快;但有時你想要速度以外的東西(擴展范圍、更好的浮點精度等),在這種情況下,你會為了你需要的其他東西犧牲一些速度。Float
math/big
- 1 回答
- 0 關注
- 194 瀏覽
添加回答
舉報
0/150
提交
取消