为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 浮点精度 float32 vs float64

Golang 浮点精度 float32 vs float64

Go
婷婷同学_ 2021-07-30 14:01:19
我写了一个程序来演示 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


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 646 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信