c - 我应该改变什么,以便我的 arctan(x) 近似可以正确显示 x=1 和 x=-1?
问题描述
我的 C 任务之一是用 C 语言编写 的近似值arctan(x)
。我应该基于的等式是
arctan(x)=\sum {k=0}^{\infty }(-1)^{k} \tfrac{x^{2k+1}}{2k+1}
此外 x 仅定义为-1<=x<=1
。
这是我的代码。
#include <stdio.h>
#include <math.h>
double main(void) {
double x=1;
double k;
double sum;
double sum_old;
int count;
double pw(double y, double n) {
double i;
double number = 1;
for (i = 0; i < n; i++) {
number *= y;
}
return(number);
}
double fc (double y) {
double i;
double number = 1;
for (i = 1; i <= y; i++){
number *= i;
}
return(number);
}
if(x >= (-1) && x <= 1) {
for(k=0; sum!=sum_old; k++) {
sum_old = sum;
sum += pw((-1), k) * pw(x, (2*k) + 1)/((2*k) + 1);
count++;
printf("%d || %.17lf\n", count, sum);
}
printf("My result is: %.17lf\n",sum);
printf("atan(%f) is: %.17f\n", x, atan(x));
printf("My result minus atan(x) = %.17lf\n", sum - atan(x));
} else {
printf("x is not defined. Please choose an x in the intervall [-1, 1]\n");
}
return 0;
}
它似乎适用于每个值,除了 value1
和-1
. 如果x=1
,则输出以:
...
7207 || 0.78543285189457468
7208 || 0.78536
而输出应该看起来更像这样。在这种情况下 x=0.5。
25 || 0.46364760900080587
26 || 0.46364760900080587
My result is: 0.46364760900080587
atan(0.500000) is: 0.46364760900080609
My result minus atan(x) atan(x) = -0.00000000000000022
如何改进我的代码,以便它可以x=1
与x=-1
.
提前致谢。
PS:我使用我自己创建的pw()
函数而不是pow()
,因为我想绕过不使用的限制,pow()
因为我们在讲座中还没有这个限制。
PPS:我很感激任何关于如何改进我的代码的建议。
解决方案
在每次迭代中,添加 (-1) k • x 2 k +1 / (2 k +1),当总和没有变化时停止。
如果这是用理想算术(精确的,无限精确的算术)计算的,它永远不会因为非零而停止x,因为你总是在改变总和。当使用固定精度算术计算时,它会在项太小时因为精度有限而不会改变总和时停止。
什么时候 | x | 小于一,因为x 2 k +1变小了。什么时候 | x | 是一,这个项变成了 1 / (2 k +1),它变得非常缓慢。直到k在 2 53左右,总和才会停止变化。
您可能会考虑将停止条件sum
更改为没有发生sum_old
很大变化而不是根本没有变化的时候。
推荐阅读
- node.js - NodeJS - 强大的 200 MB 文件限制和崩溃
- android - Android studio ics-openVPN搭建问题
- machine-learning - 自定义词汇表上的 Sklearn Countvectorizer
- html - 将 2 个元素放在同一行
- ms-access - Currentdb.Execute (Database.Execute) 不工作或抛出错误
- python-2.7 - Python遍历日期的txt文件并更改日期格式
- ios - 按年月日排序时的问题
- c# - Visual Studio + Docker - 使用编辑并继续调试应用程序?
- javascript - Chrome JavaScript 的通用串行接口库
- html - Angular 6:根据活动选项卡更改 div 的背景颜色