是什么原因导致不同机器之间的舍入误差存在差异?

Rem*_*i.b 5 operating-system rounding-error go

考虑下面的代码

\n
func main() {\n    var (\n        negativeTwoThirds = -2.0 / 3.0\n        negativeSix       = -6.0\n        negativeThree     = -3.0\n    )\n\n    for _, v := range []float64{negativeTwoThirds} {\n        four := negativeSix * v // 4 = (-6.0) * (-2/3)\n\n        print1(negativeThree + four)\n        print2(negativeThree, four)\n    }\n}\n\nfunc print1(c float64) {\n    fmt.Printf("%f (%b)\\n", c, math.Float64bits(c))\n}\n\nfunc print2(a, b float64) {\n    c := a + b\n    fmt.Printf("%f (%b)\\n", c, math.Float64bits(c))\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在个人 Linux 机器以及 go Playground(演示)上尝试了代码,它产生的输出都是我期望的输出

\n
1.000000 (11111111110000000000000000000000000000000000000000000000000000)\n1.000000 (11111111110000000000000000000000000000000000000000000000000000)\n
Run Code Online (Sandbox Code Playgroud)\n

我在两台 macOS 机器上尝试了该代码,两次都出现舍入错误

\n
1.000000 (11111111101111111111111111111111111111111111111111111111111110)\n1.000000 (11111111110000000000000000000000000000000000000000000000000000)\n
Run Code Online (Sandbox Code Playgroud)\n

你能帮我理解这些差异吗

\n
    \n
  • 之间print1print2
  • \n
  • 不同操作系统/架构/go可执行文件之间?
  • \n
\n
\n

笔记

\n
    \n
  • 我只能在 for 循环中触发差异
  • \n
  • 我用过go版本1.20.x
  • \n
  • 用于测试的两台MacBook均使用Apple M1芯片(ARM指令集),Linux机器具有第11代Intel\xc2\xae Core\xe2\x84\xa2 i7-1165G7(x86指令集)
  • \n
\n
\n

编辑:我在https://github.com/golang/go/issues/61061报告了该问题

\n