Sin函数不使用math.h库

时间:2014-10-19 02:30:41

标签: c calculator

我已经为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();
}

2 个答案:

答案 0 :(得分:3)

您的代码几乎可以使用。你有一些问题:

  1. 您在初始化之前使用pi。我建议使用更准确的pi值,例如3.14159265359

  2. powersevenpowerfivepowerthree应定义为double,而不是long int。通过将这些值存储为整数类型,您将失去精度。此外,当您将整数值除以整数值(例如powerthree/6)时,剩余部分将丢失。例如,9/61

  3. 由于sinxdouble,您应该使用printf("%f", sinx);

答案 1 :(得分:3)

vacawama涵盖了您的程序无法正常工作的大多数技术C语言原因。我将尝试涵盖一些算法。使用固定有限数量的泰勒级数项来计算正弦值会随着参数越来越远离您进行系列扩展的点而快速失去精度,即零。

要避免此问题,您需要使用正弦函数的周期性来将参数减少到有界区间。如果你的输入是弧度,这本身就是一个难题,因为pi在浮点数上是不可表示的。但是只要你在学位上工作,你就可以通过反复减去小于参数的360的最大二次幂来执行参数减少,直到你的结果在区间[0,360]。 (如果您可以使用标准库,则可以使用fmod。)

一旦你的论证处于有界区间,你就可以选择一个在该区间内足够精确的近似值。泰勒系列逼近当然是你可以使用的一种方法,但不是唯一的方法。