我必须实现我自己的版本的double cos(double x)函数,它存在于C的<math.h>库中.

关于这个函数的实现,我有一些不理解的地方.

原则上,我必须

接收用户输入(例如,double x),在该double x上实现余弦的泰勒级数.并返回一个双精度数.

我需要将我的实现与内置的double cos(double x)进行比较,并将其打印出来.

我的函数需要精确到1.0e-6的水平(这是100万分之一,小数点后7位)

我似乎对这样的实施缺乏基本的了解,因为我在这里偶然发现了许多问题.


我的用户输入是incorrect.我应用了一个双精度数字,它不仅打印出wrong number,而且每次都打印出random数字.

我用余弦的泰勒级数计算余弦值的方法也可能是不正确的.

built-in double cos(double x)功能每次都有the same behavior、打印wrong numbersrandom号码.


我已经使用了GCC编译器,并编译了以下行的文件:

gcc -ansi -Wall -pedantic my_cos.c -lm

As you can, every thing about those results is just... wrong: enter image description here


以下是我的my_Cos.h文件:

#define PI 3.1415926535
    
double my_cos(double);

以下是我的my_Cos.c文件:

#include <stdio.h>
#include <math.h>
#include "my_cos.h"


double my_cos(double x)
{
  double cos = 1 - ((pow(x,2))/(2)) + ((pow(x,4))/(24)) - ((pow(x,6))/(1*2*3*4*5*6)) + ((pow(x,8))/(1*2*3*4*5*6*7*8)) - ((pow(x,10))/(1*2*3*4*5*6*7*8*9*10));
  return cos * ((PI)/(180)); 
}

int main()
{
  double x;
  printf("Please insert a number:");
  scanf("%f", &x);

  printf("Your number is: %f\n", x);

  printf("using my function:");
  printf("%.7f\n", my_cos(x));

  printf("Using C's function:");
  printf("%f\n", cos(x));
   
  return 0;
}

这条长队double cos = 1 - ((pow(x,2))/(2)) + ((pow(x,4))/(24)) - ((pow(x,6))/(1*2*3*4*5*6)) + ((pow(x,8))/(1*2*3*4*5*6*7*8)) - ((pow(x,10))/(1*2*3*4*5*6*7*8*9*10));

is an implementation of the Taylor series of a cosine:

enter image description here

return cos * ((PI)/(180));行应该是a conversion from the degrees form to the radian form,因为内置函数还返回以弧度为单位的参数的余弦.

我非常希望得到关于如何解决这些问题和改进我的计划的建议.

推荐答案

你必须把余弦的argument换算成弧度,而不是result.如果你只有return cos;岁,你的日常生活就会很好.那么它与cos()的函数匹配得很好.

正如 comments 中指出的那样,通过因子分解可以大大简化和加快计算速度:


double my_cos(double x) {
    x *= x;
    return 1 - x/2 * (1 - x/12 * (1 - x/30 * (1 - x/56 * (1 - x/90))));
}

(当然,这是以弧度为单位的论点.任何自尊的余弦实现都应该如此.您应该在调用该函数之前进行转换.)

同样如注释中所指出的,为了准确性,这应该只在0到π/2的范围内使用(或者-π/2到π/2,如果这使代码更简单的话),将该范围之外的值转换为该范围,并为结果添加适当的符号.

使用math.h中的M_PI来代替您自己定义的(且不正确的)常量.

当把scanf()变成double时,用%lf代替%f.

C++相关问答推荐

C sscanf没有捕获第二个参数

为什么listen()(在调用accept()之前)足以让应用程序完成3次握手?

与unions 的未定义行为

可以将C变量限制为特定的读/写速度吗?

为什么GDB/MI进程的FIFO循环中有read()阻塞

非正规化边缘毛刺

在我的代码中,我需要在哪里编写输出函数?

CSAPP微型shell 实验室:卡在sigprocmask

将数据移动到寄存器时出现分段故障

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

为什么数组的最后一个元素丢失了?

不带Malloc的链表

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

C程序printf在getchar while循环后不工作

将指针的地址加载到寄存器内联拇指组件中

macos/arm64 上地址空间不使用第一位吗?

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

无法在线程内用 C 打印?

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组