Вычисление синуса с использованием ряда Тейлора
В данной задаче нужно вычислить синус аргумента, причем использование функции 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 шт):
#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));
}
}