c++中计算arctan(x)的值
Calculating the value of arctan(x) in C++
我必须计算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-100
。1e-100
也太小了。
,
您忘记在计算前两个求和后增加count
和power
:
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;
- 数组索引的值没有增加
- 'short int'持有的值溢出,但"自动"不会溢出?
- 是默认情况下分配给char数组常量的值
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 为什么我无法更改"set<set>"循环中的值<int>
- 有效地使用std::unordered_map来插入或增加键的值
- <streamsize>C++ 中 numeric_limits::max() 的值
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 无法获取webot::PositionSensor对象中位置传感器的值
- 正在将无序映射设置为无序映射的值
- 着色器纹理值与创建纹理时写入的值不同
- 无法按cpp中的值返回矢量
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何在c++中获取要更新的值
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- c++中计算arctan(x)的值