程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Golang浮点精度float32 vs float64大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Golang浮点精度float32 vs float64?

开发过程中遇到Golang浮点精度float32 vs float64的问题如何解决?下面主要结合日常开发的经验,给出你关于Golang浮点精度float32 vs float64的解决方法建议,希望对你解决Golang浮点精度float32 vs float64有所启发或帮助;

同意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

解决方法

我编写了一个程序来演示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

大佬总结

以上是大佬教程为你收集整理的Golang浮点精度float32 vs float64全部内容,希望文章能够帮你解决Golang浮点精度float32 vs float64所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: