Вычисление синуса с использованием ряда Тейлора

В данной задаче нужно вычислить синус аргумента, причем использование функции sin запрещено, то есть используем ряд Тейлора. Сигнатура: В первой строке записано одно целое число N - количество аргументов, для которых нужно вычислить синус (1<=N<=10^5). Далее идет N строк по одному вещественному числу X в каждой. Каждое число - это число, синус которого нужно вычислить. Все числа X по абсолютной величине не превышают единицу(заданы в радианах). Нужно вывести N строк, в каждой строке одно вещественное число, которое равно sin X для соответствующего аргумента из введенных данных. Рекомендуется выводить числа в формате "%0.15lf", чтобы выводилось 15 знаков после десятичной точки. Ошибка в каждом ответе не должна превышать 10^12. Вот моя программа, но через систему тестирования она не проходит, сколько бы ее ни менять. Подскажите в чем проблема, пожалуйста, и как ее исправить :)

#include<stdio.h>
int main(){
    int N;
    double k;
    double s;
    int n;
    n=1;
    k=x;
    s=0;
    scanf("%d", &N);
    for(int i=0; i<N; i++){
        scanf("%d\n", &k);
        while(fabs(k)>eps){
         s+=k;
         n++;
         k*=-x*x/(2.*n-1.0)/(2.0*n-2.0); 
         printf("%0.15lf", s);
        }
    }
   
}

upd: вот новая версия моей программы, но теперь вообще просто нули выходят, причем каждому аргументы по N раз...

#include<stdio.h>
#include<math.h>
#define eps  0.000001
double Sin(double x){
    double d, s;
    int n;
    s=d=x;
    n=1;
    while(fabs(d)>eps){
        d *= n*n;
        d *= x*x;
        +n;
        d /= n;
        ++n;
        d /= n;
        s+=d;
    }
    return s;
}

int main(){
    int N;
    double x, h;
    scanf("%d", &N);
    for(int i=0; i<N; i++){
         scanf("%d\n", &x);
         printf("%0.15lf\n", Sin(x));
        }
}

upd 2.0: искренне пытаюсь, но моя программа этого не понимает :) Теперь у меня не сходятся типы в основной части и в функции. Да и вообще чутье подсказывает, что система такую программу не захочет принимать. Хоть где-то близко к истине?

#include<stdio.h>
#include<math.h>
#define eps  0.000000000001
double Sin(double x, N){
    double d, s;
    int n;
    s=d=x;
    if(fabs(d)>eps){
         for(n=1; n<=N; n++){
             s+=d;
             d *= (-1)*x*x/(2*n)/(2*n+1);
         }
    }
    return s;
}

int main(){
    int N;
    double x;
    scanf("%d", &N);
    for(int i=0; i<N; i++){
         scanf("%d\n", &x);
         printf("%0.15lf\n", Sin(x, N));
        }
}

upd 3.0: еще одно обновление :) И снова не очень удачное. Все предупреждения и сообщения об ошибках пропали, но теперь неправильный ответ к каждому введенному аргументу. Хотя формула верная. Может в цикле какая ошибка?

#include<stdio.h>
#include<math.h>
#define eps  0.000000000001
double Sin(double x){
    double d, s;
    int n, N;
    scanf("%d", &N);
    s=d=x;
    if(fabs(d)>eps){
         for(n=1; n<=N; n++){
             s+=d;
             d *= (-1)*x*x/(2*n)/(2*n+1);
         }
    }
    return s;
}

int main(){
    int N;
    double x;
    for(int i=0; i<N; i++){
         scanf("%lf\n", &x);
         printf("%0.15lf\n", Sin(x));
        }
}

Ответы (1 шт):

Автор решения: Harry
#include<stdio.h>
#include<math.h>

#define eps  1e-12

double Sin(double x)
{
    double s = x, d = x;
    for(int n = 3; fabs(d) > eps; n+=2)
        s += d *= -x*x/n/(n-1);
    return s;
}

int main(){
    int N;
    scanf("%d", &N);
    double x;
    for(int i = 0; i < N; i++)
    {
        scanf("%lf", &x);
        printf("%0.15lf\n", Sin(x));
    }
}
→ Ссылка