当前位置: 首页 > 面试题库 >

Golang浮点精度float32 vs float64

凌永逸
2023-03-14
问题内容

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



 类似资料:
  • 我编写了一个程序来演示Go中的浮点错误: 它打印: 这与用C编写的相同程序的行为相匹配(使用双代码类型) 但是,如果改用,程序就会陷入无限循环!如果将C程序修改为使用而不是,它将打印 为什么在使用时,Go程序的输出与C程序的输出不一样?

  • 问题内容: $a = ‘35’; $b = ‘-34.99’; echo ($a + $b); 结果为0.009999999999998 这是怎么回事?我想知道为什么我的程序不断报告奇怪的结果。 为什么PHP不返回预期的0.01? 问题答案: 因为浮点运算!=实数运算。对于一些浮子和,由不精确性引起的差异的说明是。这适用于使用浮点数的任何语言。 由于浮点数是具有有限精度的二进制数,因此存在有限数量

  • 本文向大家介绍Fortran 浮点数精度,包括了Fortran 浮点数精度的使用技巧和注意事项,需要的朋友参考一下 示例 类型的浮点数real不能有任何实数值。它们可以表示实数,最多可以包含一定数量的十进制数字。 FORTRAN 77保证了两种浮点类型,而最新的标准则至少保证了两种实数类型。实变量可以声明为 x这是默认类型的实数,并且y是比更大的十进制精度的实数x。在Fortran 2008中,十

  • 运行以下代码时,我希望收到这样的输出: 但结果如下: 欢迎任何能指导我正确使用浮点比较和正确使用setprecision的建议。

  • 在我的计算机科学课程中,我们正在研究浮点数以及它们在内存中是如何表示的。我已经理解了它们在内存中是如何表示的(尾数/有效数、指数及其偏差、符号位),我也理解了浮点是如何相互添加和减去的(反规格化和所有那些有趣的东西)。然而,在翻阅一些学习问题时,我注意到一些我无法解释的东西。 当一个不能精确表示的浮点数加到自己身上几次时,答案比我们在数学上预期的要低,但当同一个浮点数乘以一个整数时,答案就精确地得