Функцию синуса на С, но ответ выдает гараздо больше нужного

Рейтинг: -2Ответов: 2Опубликовано: 25.02.2023

Пишу функцию синуса на С, но ответ выдает гараздо больше нужного (и соответственно больше 1), не могу понять в чем ошибка

#include<stdio.h>
#include<stdlib.h> // для модуля

float sinus(float radians, float epsilon);

int main() {
   int a = 500;
   float b;
   b = sinus(a, 0.001);
   printf("%f", b);
   if(b > 1 || b < -1)
      printf("\nFunction works incorrect!\n");
   else
      printf("\nFunction works correct!\n");
   return 0;
}

float sinus(float radians, float epsilon){
    radians = radians / 180 * 3.14; // перевод из радианов в градусы
    int k = 0; // счетчик итераций
    float s = 0; // сумма всех чисел в Тейлоровом ряде 
    
    while(abs(radians) > epsilon){
        s = s + radians;
        radians = radians * (-(radians * radians)/2*k)/(2*k * (k+1));
        k++;
    }
    return s;
}

Ответы

▲ 0
#include<stdio.h>
#include<stdlib.h> // для модуля

float sinus(float radians, float epsilon);

int main() {
   int a = 500;
   float b;
   b = sinus(a, 0.001);
   printf("%f", b);
   if(b > 1 || b < -1)
      printf("\nFunction works incorrect!\n");
   else
      printf("\nFunction works correct!\n");
   return 0;
}

float sinus(float radians, float epsilon){
    radians = radians / 180 * 3.14; // перевод из радианов в градусы
    float r = radians;
    int k = 0; // счетчик итераций
    float s = 0; // сумма всех чисел в Тейлоровом ряде 
    
    while(abs(radians) > epsilon){
        s += radians;
        k++;
        radians = radians * (-r*r)/(2*k * (2*k+1));
    }
    return s;
}
▲ 0

Самая большая ваша ошибка - работа с таким огромным агрументом, 500. В результате у вас ряд будет вычислен некорректно. Вам надо привести это значение к диапазону от 0 до pi пополам (с учетом соответствующего знака), а потом вычислять.

Посмотрите на вот этот вопрос - в нем рассматривается функция синус в кубе, но это непринципиально. В ответах хорошо показано, почему так делать нельзя.