Пытаясь вычислить пи в го, что я делаю не так? Возможно проблема с математикой.

Я рисую квадрат внутри круга диаметром 1, диагональ квадрата - это диаметр круга. Затем я разделил этот квадрат на 4 прямоугольных треугольника, используя закон косинуса и зная, что длины a и b на треугольнике равны 0,5, я создаю 4 треугольника, гипотонусы которых складываются вместе, образуя периметр квадрата. Дав нам уравнение периметр = количество сторон * (a ^ 2 + b ^ 2 -2abcos (360 / количество сторон)) Увеличивая количество сторон на этой фигуре, периметр становится все ближе и ближе к периметру круга ( 3.14).

Я делал это раньше в python, и это работало, но была проблема с использованием закона косинуса на градусах вместо rad в python, который испортил его.

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. Я проверял свою математику снова и снова, но я думаю, что это проблема с языком, а не с тем, что я делаю.

-9
задан Steffen Ullrich 27 July 2019 в 20:01
поделиться

1 ответ

Не используйте стандартную функцию Cos - как многие люди сказали, для использования этого необходимо уже знать значение пи, потому что это берет свой аргумент в радианах.

тригонометрические функции Большинства языков программирования используют радианы в качестве своих аргументов . Это вызвано тем, что существуют хорошие, простые формулы для приближения аккуратного. функции, если Вы используете радианы.

В любом случае, хотя, здесь Вам не нужен он! Вы удваиваете значение 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))
    }

}

Это сходится, как желаемый.

<час>

Кстати, примечание, что первоначально Вы хотели что-то, что сходилось к половине круга в радианах (то есть, к пи), но вместо этого получило что-то, что сходилось к половине круга в градусах (то есть, к 180). Это точно, потому что Вы вручили градусы Cos, когда необходимо было вручить ему радианы.

0
ответ дан 9 September 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: