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

Вот еще одна реализация strtok(), которая имеет возможность распознавать последовательные разделители (в стандартной библиотеке strtok() этого нет)

Эта функция является частью лицензированной библиотеки BSD, называемой zString . Вы более чем можете внести свой вклад:)

https://github.com/fnoyanisi/zString

char *zstring_strtok(char *str, const char *delim) {
    static char *static_str=0;      /* var to store last address */
    int index=0, strlength=0;       /* integers for indexes */
    int found = 0;                  /* check if delim is found */

    /* delimiter cannot be NULL
    * if no more char left, return NULL as well
    */
    if (delim==0 || (str == 0 && static_str == 0))
        return 0;

    if (str == 0)
        str = static_str;

    /* get length of string */
    while(str[strlength])
        strlength++;

    /* find the first occurance of delim */
    for (index=0;index

Как упоминалось в предыдущих сообщениях, поскольку strtok() или тот, который я вложил выше, полагается на переменную static *char, чтобы сохранить местоположение последнего разделителя между последовательными вызовами, следует проявлять особую осторожность при работе с многопоточными приложениями.

-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
поделиться
Другие вопросы по тегам:

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