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 程序以使用 afloat而不是 a double,它会打印


After 27 iterations, a = 1.600000e+00

为什么 Go 程序在使用时没有与 C 程序相同的输出float32?


婷婷同学_
浏览 647回答 2
2回答

呼如林

同意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)&nbsp;+&nbsp;float64(0.1))&nbsp;-&nbsp;float64(0.3))然后我在 1.1920929e-8f 附近找到了一些东西经过 27 次迭代后,总和为 1.6f
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go