gpt4 book ai didi

c - 当我更改 numberOfTerms 时,为什么我的代码不准确?

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:03 25 4
gpt4 key购买 nike

#include <stdio.h>

double pi = 3.141592653589;
int numberOfTerms = 5;

int factorial(int n)
{
if(n > 1)
return n * factorial(n - 1);
else
return 1;
}

double DegreesToRadian( double degrees )
{
return degrees * pi / 180;
}

void cosine(double cos){
int x = 0;
double ans = 1;
int exponent = 2;
int isPlus = 0;
for(x; x < numberOfTerms - 1; x++){
if(isPlus == 0){
ans -= (pow(cos, exponent))/factorial(exponent);
exponent += 2;
isPlus = 1;
}else{
ans += (pow(cos, exponent))/factorial(exponent);
exponent += 2;
isPlus = 0;
}
}
printf ("%.12f \t", ans);
}

void sine(double sin){
int x = 0;
double ans = sin;
int exponent = 3;
int isPlus = 0;
for(x; x < numberOfTerms - 1; x++){
if(isPlus == 0){
ans -= (pow(sin, exponent))/factorial(exponent);
exponent += 2;
isPlus = 1;
}else{
ans += (pow(sin, exponent))/factorial(exponent);
exponent += 2;
isPlus = 0;
}
}
printf ("%.12f \n", ans);
}

int main()
{
double j = -180.00;
printf(" ");
printf("\n\n");

for (j; j <= 180; j += 5){
printf("%.2f \t", j);
printf( "%.12f \t", DegreesToRadian(j));
cosine(DegreesToRadian(j));
sine(DegreesToRadian(j));
}

return 0;
}

我正在使用泰勒级数计算数字的正弦和余弦,但是当我将 numberOfTerms 更改为 10 或 15 时,它变得不准确(waaaaaaaaayy 关闭),我需要更改什么才能使其准确? (是的,我的功能不是最佳的 lel)

如果这很重要,我会收到内置函数“pow”的 [警告] 不兼容隐式声明。

最佳答案

让我们假设您保留 numberOfTerms 的值作为10 .然后,在 cosinesine功能,在for循环,你递增 exponent通过 2每次。而且,您正在使用 exponent 的阶乘在分母中。

如果循环运行 9次,exponent 的值将增加为 2, 4, 6, 8, 10, 12, 14, 16, 18 .

我们知道14! = 87178291200 .但是一个signed int (用于返回阶乘函数的结果)可以保持最大为 2147483647 的正值.发生溢出。

我建议你使用 double (甚至 unsigned long long )用于阶乘函数的返回类型和参数。但是不要尝试计算大数的阶乘,因为它们不适合 C 中的任何数据类型。

此外,由于您尚未定义 pow自己动手,我想你缺少一个#include<math.h>在顶部。

另一个建议,定义pi作为符号常量而不是全局变量。

关于c - 当我更改 numberOfTerms 时,为什么我的代码不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40571924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com