go - 为什么Go不能使float溢出而整数可以呢?

标签 go overflow

我已经在Go中测试了一些东西,发现整数可能溢出,但是float64float32显然不会溢出。

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
出于性能原因,显然不检查整数溢出,但是为什么我不能使浮点数溢出?他们检查了吗?

最佳答案

因为数据结构根本不同。大多数编程语言(two's complement)用于(至少大部分)其整数数据类型的including Go结构作为其工作方式的副产品而溢出。大多数编程语言(包括Go)使用的IEEE-754 floating point(至少大多数)用于其浮点数据类型不会溢出,其工作方式的数量只会不断增加,一旦超过某个点,该数字甚至在整数级别也开始失去精度。
只是将数字数据存储在固定大小的一组位中的两种机制在根本上是不同的。
还有其他结构。例如,某些语言具有大小固定的“大整数”和/或“大十进制”类型;取而代之的是,他们占用了容纳号码所需的空间。 (Java的BigIntegerBigDecimal,JavaScript的BigInt,...)Go在 Int package中具有RatFloatmath/big。 (感谢Adrian!)固定大小的代码非常有用,因为它们非常快。但有时您想要的不是速度(扩展范围,浮点精度更高等),在这种情况下,您会为其他所需的东西而牺牲一些速度。

关于go - 为什么Go不能使float溢出而整数可以呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63358564/

相关文章:

go - 在未导出的字段上调用导出的方法

html - 滚动条可见,无法滚动

c++ - 我有一个浮点溢出问题

java - 关于整数乘法、溢出和信息丢失

performance - Go语言中通用类型(int/uint)相对于特定类型(int64/uint64)有什么优势?

regex - golang 如何使用正则表达式将字符串拆分为包含分隔符的 slice

go - 关于 Go 语言的语法?

webkit - css 位置、边界半径、溢出在 webkit 中不受尊重 - 其他解决方案?

html - 调整窗口大小时调整 div 高度以适应溢出

http - GOLANG,HTTP 有 "use of closed network connection"错误