为什么 Go 浮点数不能溢出而整数可以?

我在 Go 中测试了一些东西,注意到整数可以溢出,但float64显然float32不能。


f64 := math.MaxFloat64

fmt.Printf("%f\n", f64)

fmt.Printf("%f\n", f64+1)


f32 := math.MaxFloat32

fmt.Printf("%f\n", f32)

fmt.Printf("%f\n", f32+1)


i := math.MaxInt64

fmt.Printf("%d\n", i)

fmt.Printf("%d\n", i+1)

结果:


179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000

340282346638528859811704183484516925440.000000

340282346638528859811704183484516925440.000000

9223372036854775807

-9223372036854775808

出于性能原因,显然没有检查整数溢出,但为什么我不能让浮点数溢出?他们被检查了吗?


LEATH
浏览 173回答 1
1回答

开满天机

因为数据结构根本不同。大多数编程语言(包括 Go )用于(至少大部分)其整数数据类型的二进制补码结构作为其工作方式的副产品溢出;大多数编程语言(包括 Go)用于(至少大部分)其浮点数据类型的IEEE-754 浮点不会溢出,它的工作方式数字的大小只会继续增加,并且一旦过去某个点,即使在整数级别,数字也开始失去精度。只是将数字数据存储在一组固定大小的位中的两种机制的工作方式根本不同。还有其他结构。例如,某些语言具有不固定大小的“大整数”和/或“大十进制”类型;相反,它们占用了存放该号码所需的空间。(Java 的BigInteger和BigDecimal,JavaScript 的BigInt,...)Go在包Int中有,Rat和。(谢谢阿德里安!)固定大小的非常有用,因为它们非常快;但有时你想要速度以外的东西(扩展范围、更好的浮点精度等),在这种情况下,你会为了你需要的其他东西牺牲一些速度。Floatmath/big
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go