Go 试图计算围棋中的圆周率,我做错了什么?可能是数学问题,因为?

Go 试图计算围棋中的圆周率,我做错了什么?可能是数学问题,因为?,go,math,Go,Math,我在直径为1的圆内画了一个正方形,正方形的对角线是圆的直径。然后我用余弦定律把这个正方形分成4个直角三角形,知道三角形上a和b的长度是0.5,我创建了4个三角形,它们的斜边加在一起形成正方形的周长。给出周长=边数*(a^2+b^2-2abcos(360/边数))的公式,通过增加此形状上的边数,周长越来越接近圆的周长(3.14) 我以前在python中做过这项工作,它很管用,但在python中使用余弦定律而不是rad时出现了一个问题,这把它搞砸了 package main import "fmt

我在直径为1的圆内画了一个正方形,正方形的对角线是圆的直径。然后我用余弦定律把这个正方形分成4个直角三角形,知道三角形上a和b的长度是0.5,我创建了4个三角形,它们的斜边加在一起形成正方形的周长。给出周长=边数*(a^2+b^2-2abcos(360/边数))的公式,通过增加此形状上的边数,周长越来越接近圆的周长(3.14)

我以前在python中做过这项工作,它很管用,但在python中使用余弦定律而不是rad时出现了一个问题,这把它搞砸了

package main

import "fmt"
import "math"

func main() {

    for n := float64(4) ; n == n; n *= 2 {
        fmt.Println(n)
        c := math.Pow(0.5 - (0.5 * math.Cos(360 / n)), 0.5)
        fmt.Println(c * n)
    }

}

答案应该从大约3开始,然后上升到接近3.14,但是答案反而上升到180。我已经反复检查了我的数学,但我认为这是语言的问题,而不是我在做什么。

不要使用标准函数
Cos
——正如许多人所说,要使用它,你需要知道pi的值,因为它的参数是弧度

大多数计算机语言的三角函数都使用弧度作为参数。这是因为有很好的,简单的公式来近似三角。函数,如果使用弧度

无论如何,在这里你不需要它!每次都将
n
的值加倍,因此可以使用众所周知的余弦半角公式:

package main

import "fmt"
import "math"

func main() {
    cosVal := float64(-1) // Start at cosine of 180 degrees
    for n := 4 ; n < 5000; n *= 2 {
        fmt.Println(n)
        cosVal = math.Sqrt(0.5 * (cosVal + 1.0))
        c := math.Pow(0.5 - 0.5*cosVal, 0.5)
        fmt.Println(c * float64(n))
    }

}
主程序包
输入“fmt”
导入“数学”
func main(){
cosVal:=float64(-1)//从180度的余弦开始
对于n:=4;n<5000;n*=2{
fmt.Println(n)
cosVal=math.Sqrt(0.5*(cosVal+1.0))
c:=数学功率(0.5-0.5*cosVal,0.5)
格式打印LN(c*64(n))
}
}
这会根据需要收敛



顺便说一句,请注意,最初您想要的是以弧度收敛到半个圆的值(即,到pi),但得到的是以度收敛到半个圆的值(即,到180度)。这正是因为当你应该把弧度交给
Cos
时,你把度交给了它。

我认为
360
是一个以度为单位的完整圆,这意味着你以度为单位计算角度,然后把它放到
math.Cos
中。但是
math.Cos
需要弧度,即需要使用
2*pi
而不是
360
。基本上,然后输入
pi
来计算
pi
。“…但是在python中使用余弦定律而不是rad时出现了一个问题,这把事情搞砸了。”-是的,这里的问题完全相同。正如@SteffenUllrich所写的,您必须编写
math.Cos(2*math.Pi/n)
才能将度转换为弧度。这将导致迭代在一段时间内收敛到Pi,之后可能会由于@kostix的原因而转移。您不能使用
math.Sqrt()
而不是
math.Pow(…,0.5)
?是的,您可以。我故意使此代码尽可能与原始代码相似。