Golang浮点精度float32 vs float64
我编写了一个程序来演示Go中的浮点错误:
func main() { a := float64(0.2)
a += 0.1
a -= 0.3
var i int
for i = 0; a < 1.0; i++ {
a += a
}
fmt.Printf("After %d iterations, a = %e\n", i, a)
}
它打印:
After 54 iterations, a = 1.000000e+00
这与用C编写的同一程序的行为匹配(使用double
类型)
但是,如果float32
使用,则该程序将陷入无限循环!如果您将C程序修改为使用a float
而不是a double
,则会输出
After 27 iterations, a = 1.600000e+00
使用时,为什么Go程序没有与C程序相同的输出float32
?
回答:
同意ANisus,go在做正确的事。关于C,我不相信他的猜测。
C标准没有规定,但是libc的大多数实现会将十进制表示形式转换为最接近的浮点数(至少符合IEEE-754 2008或ISO
10967),因此我认为这不是最可能的解释。
C程序的行为可能不同的原因有很多……特别是,某些中间计算可能会以超高的精度(双精度或长双精度)执行。
我能想到的最可能的事情是,是否曾经在C语言中写过0.1而不是0.1f。
在这种情况下,您可能会在初始化时产生过高的精度
(您将float a + double求和0.1 => float会转换为double ,然后将结果转换回浮点数)
如果我模拟这些操作
float32(float32(float32(0.2) + float64(0.1)) - float64(0.3))
然后我发现在1.1920929e-8f附近
经过27次迭代,总计为1.6f
以上是 Golang浮点精度float32 vs float64 的全部内容, 来源链接: utcz.com/qa/434106.html