我在 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 关注
- 172 浏览
添加回答
举报
0/150
提交
取消