我已经为FOP做了一个科学计算器的任务,我们还没有学过math.h库!我对SIN之一的基本方法就是这个 但我没有做这项工作
#include <stdio.h>
int main()
{
int input;
float pi;
double degree;
double sinx;
long int powerseven;
long int powerfive;
long int powerthree;
input = 5;
degree= (input*pi)/180;
pi=3.142;
powerseven=(degree*degree*degree*degree*degree*degree*degree);
powerfive=(degree*degree*degree*degree*degree);
powerthree=(degree*degree*degree);
sinx = (degree - (powerthree/6) + (powerfive/120) - (powerseven/5040));
printf("%ld", sinx);
getchar();
}
答案 0 :(得分:3)
您的代码几乎可以使用。你有一些问题:
您在初始化之前使用pi
。我建议使用更准确的pi
值,例如3.14159265359
。
powerseven
,powerfive
和powerthree
应定义为double
,而不是long int
。通过将这些值存储为整数类型,您将失去精度。此外,当您将整数值除以整数值(例如powerthree/6
)时,剩余部分将丢失。例如,9/6
为1
。
由于sinx
是double
,您应该使用printf("%f", sinx);
答案 1 :(得分:3)
要避免此问题,您需要使用正弦函数的周期性来将参数减少到有界区间。如果你的输入是弧度,这本身就是一个难题,因为pi在浮点数上是不可表示的。但是只要你在学位上工作,你就可以通过反复减去小于参数的360的最大二次幂来执行参数减少,直到你的结果在区间[0,360]。 (如果您可以使用标准库,则可以使用fmod
。)
一旦你的论证处于有界区间,你就可以选择一个在该区间内足够精确的近似值。泰勒系列逼近当然是你可以使用的一种方法,但不是唯一的方法。