我正在浏览 Go,并且在“练习:循环和函数”中遇到了 float64 比较的问题,您在其中编写了一个函数来确定平方根。
\n\n示例:\n计算机通常使用循环计算 x 的平方根。从一些猜测 z 开始,我们可以根据 z\xc2\xb2 与 x 的接近程度来调整 z,从而产生更好的猜测:
\n\nz -= (z*z - x) / (2*z)\nRun Code Online (Sandbox Code Playgroud)\n\n我编写了一个函数,该函数会继续更新 z 直到值停止变化。只有 float64 比较永远不会失败,这会导致无限循环。解决此类问题的一种方法是四舍五入,但我不确定如何在 golang 中在不使用数学模块的情况下做到这一点。
\n\n在 golang 中如何舍入 float64 数字以及在 golang 中比较浮点数的标准方法是什么?
\n\n\npackage main\n\nimport (\n "fmt"\n)\n\n\nfunc Sqrt(x float64) float64 {\n // Need to look into float rounding in go\n z := 1.0\n zprev := 0.01\n for z != zprev {\n zprev = z\n z -= (z*z - x) /(2*z)\n fmt.Printf("z: %g\\nzprev: %g\\n", z, zprev)\n fmt.Println("_________________________________________")\n\n\n }\n fmt.Println("Finished")\n return z\n}\n\n\nfunc main() {\n fmt.Println(Sqrt(2))\n}\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\nz: 1.5\nzprev: 1\n_________________________________________\nz: 1.4166666666666667\nzprev: 1.5\n_________________________________________\nz: 1.4142156862745099\nzprev: 1.4166666666666667\n_________________________________________\nz: 1.4142135623746899\nzprev: 1.4142156862745099\n_________________________________________\nz: 1.4142135623730951\nzprev: 1.4142135623746899\n_________________________________________\nz: 1.414213562373095\nzprev: 1.4142135623730951\n_________________________________________\nz: 1.4142135623730951\nzprev: 1.414213562373095\n_________________________________________\nz: 1.414213562373095\nzprev: 1.4142135623730951\n_________________________________________\nz: 1.4142135623730951\nzprev: 1.414213562373095\n_________________________________________\nz: 1.414213562373095\nzprev: 1.4142135623730951\n_________________________________________\n\nRun Code Online (Sandbox Code Playgroud)\n\n在点 z 和 zprev 继续在仅相差一个精度点(1.414213562373095 和 1.4142135623730951)的 2 个值之间无限期地交替
\n不要四舍五入,取要比较的两个数字之间的差值,并检查它是否在-epsilon和 之间epsilon,其中epsilon是您认为足够小的差值。
注意:不可靠的相等比较不是特定于 go 的;这是浮点数的普遍问题。