c++中计算arctan(x)的值

Calculating the value of arctan(x) in C++

本文关键字:的值 arctan 计算 c++      更新时间:2023-10-16

我必须计算arctan(x)的值。我通过计算以下序列来计算它的值:

反正切(x) = x - x ^ 3/3 + x - x ^ ^ 5/5 7/7 + x ^ 9/9 -…

但是下面的代码不能计算实际值。例如,calculate_angle(1)返回38.34。为什么?

const double DEGREES_PER_RADIAN = 57.296;
double calculate_angle(double x)
{
    int power=5,count=3;
    double term,result,prev_res;
    prev_res = x;
    result= x-pow(x,3)/3;
    while(abs(result-prev_res)<1e-10)
    {
        term = pow(x,power)/power;
        if(count%2==0)
            term = term*(-1);
        prev_res=result;
        result=result+term;
        ++count;
        power+=2;
       // if(count=99)
         //   break;
    }
    return result*DEGREES_PER_RADIAN;
}

我找到了罪魁祸首。你忘了包括stdlib.h,函数abs所在的地方。您一定忽略了关于隐式声明abs的警告。我检查了一下,删除include的结果是38.19,包含它的结果是~45。

当使用未声明的函数(在本例中为abs)时,编译器不需要停止编译。相反,允许对函数的声明方式进行假设(在本例中是错误的假设)

此外,就像其他海报已经说过的,你使用abs是不合适的,因为它返回int,而不是双精度或浮点数。while中的条件应该是>1e-100,而不是<1e-1001e-100也太小了。

,

您忘记在计算前两个求和后增加countpower:

prev_res = x;
result= x-pow(x,3)/3;
count = 4; <<<<<<
power = 5; <<<<<<
while(abs(result-prev_res)<1e-100)
{
    term = pow(x,power)/power;
    if(count%2==1)
        term = term*(-1);

我也认为你对count变量的使用是违反直觉的:它是用3初始化的,就像它表示最后使用的功率一样;然后,循环迭代增加1而不是2你决定用count%2 == 1而不是power%4 == 3

该级数收敛于tan^{-1} x,但速度不是很快。考虑x=1:

时的系列
1 - 1/3 + 1/5 - 1/7 + 1/9 - ...

截断1/9项时的错误是什么?在1/9左右。为了获得10^{-100}的准确性,您需要有10^{100}项。在你得到它之前,宇宙就已经终结了。而且,灾难性的舍入误差和截断误差会使答案完全不可靠。你只有14个数字可以玩double秒。

参考文献,如Abramowitz和Stegun [AMS 55]或新的NIST数学函数数字图书馆http://dlmf.nist.gov,看看这些在实践中是如何完成的。通常,人们使用帕德帕尔近似而不是泰勒级数。即使你坚持使用泰勒级数,你也经常使用切比雪夫近似来减少总误差。

我还推荐福尔曼·阿克顿(Forman Acton)的《通常有效的数值方法》。或者《数字食谱》中的……系列。

你的符号在前两项后面是错误的。应该是:

if(count%2==0)
  term = term*(-1);

在while条件中,您的比较方式是错误的。此外,您还期望获得不切实际的高精确度。我建议这样写:

while(fabs(result-prev_res)>1e-8)

最后,您将获得更准确的结果,DEGREES_PER_RADIAN的值更好。为什么不像这样:

const double DEGREES_PER_RADIAN = 180/M_PI;