我写了一个程序来演示 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?
2 回答
呼如林
TA贡献1798条经验 获得超3个赞
同意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
- 2 回答
- 0 关注
- 646 浏览
添加回答
举报
0/150
提交
取消