Я попытался создать пользовательскую функцию sine
, используя c
и Taylor Series для вычисления sin
с 10 элементами в ряду, но я получаю неверные результаты, когда пытаюсь найти sine(x)
, где x > 6
.
Это хорошо работает для -5 < x < 5
, но что-либо вне этого диапазона не дает правильных результатов.
Я ожидаю, что sin(10)
вернет что-то близкое к -0.5440
, но получите 1418.0269775391
Я поместил все в один файл, чтобы было проще.
#include <stdio.h>
#include <stdlib.h>
double factorial(double n);
double power(double n, double pow);
double sine(double n);
// This is supposed to all go in a .c file and reference the .h stuff above
// This is the actual implementation of the functions declared above
double factorial(double n) {
// 0! = 1 so just return it
if(n == 0) {
return 1;
}
// Recursively call factorial with n-1 until n == 0
return n * (factorial(n - 1));
}
double power(double n, double power) {
double result = n;
// Loop as many times as the power and just multiply itself power amount of times
for(int i = 1; i < power; i++) {
result = n * result;
}
return result;
}
double sine(double n) {
double result = n;
double coefficent = 3; // Increment this by 2 each loop
for(int i = 0; i < 10; i++) { // Change 10 to go out to more/less terms
double pow = power(n, coefficent);
double frac = factorial(coefficent);
printf("Loop %d:\n%2.3f ^ %2.3f = %2.3f\n", i, n, coefficent, pow);
printf("%2.3f! = %2.3f\n", coefficent, frac);
// Switch between adding/subtracting
if(i % 2 == 0) { // If the index of the loop is divided by 2, the index is even, so subtract
result = result - (pow/frac); // x - ((x^3)/(3!)) - ((x^5)/(5!))...
} else {
result = result + (pow/frac); // x - ((x^3)/(3!)) + ((x^5)/(5!))...
}
coefficent = coefficent + 2;
printf("Result = %2.3f\n\n", result);
}
return result;
}
// main starting point. This is suppossed to #include "functions.c" which contain the above functions in it
int main(int argc, char** argv) {
double number = atof(argv[1]); // argv[1] = "6"
double sineResult = sine(number);
printf("%1.10f", sineResult);
return (0);
}
double number = atof("5")
? Почему бы просто неdouble number = 5.0
? Или просто позвонитьsine(5.0)
? Или, поскольку функция принимает аргументint
,int number = 5;
илиsine(5)
? - person Some programmer dude   schedule 13.02.2018sin(1)
доsin(5)
. У меня нет другой причины, почему это не сработает для любого другогоsin(x)
. Я также используюatof("5")
вместоatof(argv[1])
. - person Jimenemex   schedule 13.02.2018int
во многих местах. В конце концов, один из них переполнится. Например,power(10, 10)
не вернет правильный ответ (поскольку правильный ответ — 10 миллиардов, что не помещается в 32-битноеint
). - person user3386109   schedule 13.02.2018float
не сильно помогает. По крайней мере, используйтеdouble
везде. - person user3386109   schedule 13.02.2018x
становится больше, числитель каждого члена растет быстрее, а это означает, что вам нужно больше членов, чтобы знаменатель наверстал упущенное. Лучшее решение — вычитать или прибавлять 2π по мере необходимости, покаx
не окажется между -π и π. Таким образом, вам нужно только достаточно терминов, чтобы получить точные результаты для небольших значенийx
. - person user3386109   schedule 13.02.2018sine(n)
сначала используйтеn = fmod(n, 2*pi);
или эквивалент. - person chux - Reinstate Monica   schedule 13.02.2018int
вpower
, измените его наdouble
иsine(6)
появится как-0.279
, что достаточно близко к более точному результату-0.27941549819892587281
. - person deamentiaemundi   schedule 13.02.2018sine()
. См. https://www.csee.umbc.edu/~phatak/645/supl/Ng-ArgReduction.pdf - person chux - Reinstate Monica   schedule 13.02.2018double
вместоint
иfloat
? - person Jimenemex   schedule 13.02.2018n = fmod(n, 2*pi);
, чтобы увидеть, решит ли это проблемы. Затем найдите идеи сокращения без использования каких-либо других ресурсов. - person chux - Reinstate Monica   schedule 13.02.2018int main(int argc, char** argv) {
Ни один из параметров не используется, поэтому либо первые две строки в телеmain()
должны быть:(void)argc;
и(void)argv;
, либо подпись должна быть:int main( void )
- person user3629249   schedule 13.02.2018double power(double n, double power) {
рабочее значение равноint
((int result = n;)) и возвращаемое значение равноint
((возвращенный результат;)) Это не согласуется ни с логикой функции, ни с сигнатурой функция, в которой указано, что возвращаемый тип будетdouble
- person user3629249   schedule 13.02.2018double coefficent = 3;
эта переменная объявляется какdouble
, так зачем передавать ейint
? Предложить:double coefficent = 3.0;
Аналогично дляcoefficent = coefficent + 2;
Предложить:coefficent = coefficent + 2.0;
- person user3629249   schedule 13.02.2018