Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Синус и косинус


Автор: kleks 21.5.2006, 14:03
Может кто-нибудь реализовывал такие функции как sin() и cos(), или может кто-нибудь подскажет как это можно сделать?! заранее благодарен....

 

Автор: Replicator 21.5.2006, 14:07
Разложением в ряд Тейлора. 

Автор: Droll 21.5.2006, 14:40
Вычисление синуса и косинуса есть в модуле Math.h
Вычисление косинуса и синуса через разложение Тейлора приведено в области имен Tailor
Код

#include <iostream>
#include <math.h>

// Число Пи - для перехода от радиан к градусам
#define PI 3.1415926535897932384626433832795

// Вычисление косинуса и синуса через разложение Тейлора:
namespace Tailor
{
    // Точность вычислений
    #define  TOLERANCE 10e-10
    
    float Sin(float x)
    {
        float add = x;      // первый член ряда
        float mul = -(x*x); // Модификатор
        float result = x;   // результат

        for (int i=3;(add > TOLERANCE) || (add < -TOLERANCE); i += 2)
        {
            add = add * mul/(i * (i - 1)); // превращаем член  ряда в следующий
            result += add;
        }
        return result;
    }
    
    float Cos(float x)
    {
        float mul = -(x*x); // Модификатор
        float add = mul/2; // Второй член
        float result = 1 + add; // Результат

        for (int i = 4;(add > TOLERANCE) || (add < -TOLERANCE); i += 2)
        {
            add = add * mul/(i * (i - 1)); // Следующий член ряда
            result += add;
        }
        return result;
    }
}

int main(int argc, char *argv[])
{
    float X;
    // Введите Х
    printf("Input X = ");
    scanf("%f", &X);
    // Синус (в радианах)
    printf("\n\nsin(%1.2f[rad]) == %1.4f\n", X, sin(X));
    // Синус (в градусах)
    printf("sin(%1.2f[deg]) == %1.4f\n", X, sin((X * PI)/180));
    // Коинус (в радианах)
    printf("\ncos(%1.2f[rad]) == %1.4f\n", X, cos(X));
    // Косинус (в градусах)
    printf("cos(%1.2f[deg]) == %1.4f\n", X, cos((X * PI)/180));
    
    using namespace Tailor;
    
    printf("\n\nTailor:\n");

    // Синус (в радианах)
    printf("\nsin(%1.2f[rad]) == %1.4f\n", X, Sin(X));
    // Синус (в градусах)
    printf("sin(%1.2f[deg]) == %1.4f\n", X, Sin((X * PI)/180));
    // Коинус (в радианах)
    printf("\ncos(%1.2f[rad]) == %1.4f\n", X, Cos(X));
    // Косинус (в градусах)
    printf("cos(%1.2f[deg]) == %1.4f\n", X, Cos((X * PI)/180));

    system("PAUSE");
    return 0;
}

Удачи!
  

Автор: kleks 21.5.2006, 16:09
Спасибо огромное!!!! Но у меня возник вопрос я сейчас пишу класс для работы с бесконечно длинными числами и поэтому Ваши функции мне пришлось не много переделать:
Код

BigInt Cos(BigInt x)
{
    BigInt TOLERANCE ("0.0000000001");
    BigInt a("2"),c("1"),i("4");
    BigInt mul (-(x*x)); // Модификатор
    BigInt add = mul/a; // Второй член
    BigInt result = c + add; // Результат
       for (i;(add > TOLERANCE) || (add < -(TOLERANCE)); i += a)
        {
            add = add * mul/(i * (i - c)); // Следующий член ряда
            result += add;
        }
        return result;
}


А вопрос вообщем то вот в чём: когда я вычисляю при помощи данной функции, например cos(1), результат у меня таков: 0,54029974560953182242, что достаточно сильно отличается от идеала (windows calc) 0.5403023058681397174, отчего это может происходить (увеличивал точноть, но безрезультативно)..., смотрел как работают Ваши функции, без моего, так сказать вмешательства, то там всё как положенно, всё точно!!!!  

Автор: bsa 21.5.2006, 16:18
проверяй точность базовых операций, сложение, вычитание, деление и умножение. 

Автор: kleks 21.5.2006, 16:25
точность базовых операций я проверял...там всё ок!!!!!!!!!!! 

Автор: Replicator 21.5.2006, 17:37
Тогда в формуле разложения косячек. 

Автор: kleks 21.5.2006, 18:55
Цитата

Тогда в формуле разложения косячек. 

Интересно какие...может можно как-нибудь по другому разложить....? 

Автор: murrosy 16.12.2015, 16:25
Раньше у меня вычисления отнимали очень много времени. А теперь пользуюсь классным сервисом. Например, если надо посчитать косинус, то иду сюда: https://algebra24.ru/vychislenie-cosinusa/?utm_source=forum.vingrad.ru&utm_medium=PR&utm_campaign=Novikova&utm_content=OtvetVSinusIKosinus&utm_term=VichislenieKosinysov.

Автор: feodorv 16.12.2015, 20:49
murrosy
Цитата
404
Страница не существует

Автор: Alexeis 17.12.2015, 19:53
С тейлором есть особенности. Он хорошо сходится для малых углов. Чем больше угол тем медленнее сходится. Насколько я помню на практике раскладывают синус только в диапазоне от 0..45 градусов, остальные углы пересчитывают по формулам тригонометрии. 
45 градусов это примерно 0,78. Для единицы я вообще не уверен что ряд сойдется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)