使用std :: acos从std :: cos(角度)恢复精确角度

时间:2016-10-15 15:50:55

标签: c++ std precision numerical-stability

C ++标准保证angle == std::acos(std::cos(angle))如果angle在[0,Pi]范围内,或者换句话说是否可以恢复{{1}的确切原始值} angle使用std::cos给出上述范围限制的结果?

省略std::acos angleinfinity时的边际情况。

4 个答案:

答案 0 :(得分:3)

回答StoryTeller:

  

标准无法保证,只是因为std::cos的结果可能无法由double完全表示,因此会出现截断错误,这会影响{{1}的结果}。

答案 1 :(得分:3)

来自cppreference.com:

  

如果没有错误发生,[acos返回] arg(arccos(arg))的反余弦在[0; π]

以度为单位,即0到180(包括0和180),对应于余弦值1到-1(包括-1)。

在该范围之外,你甚至无法得到近似的信件。计算余弦丢弃有关您在该范围之外的角度的信息。没有办法得到这些信息。

如何丢弃信息:

首先,以度为单位,cos(x)= cos(K * 360 + x),对于任意整数K.其次,cos(x)= cos(-x)。这相当于产生相同余弦值的大量角度值。

另外,即使所有读者都知道这一点,但是为了完整性:因为正弦是余弦是非常无理的数字,通常不是简单的分数,你不能指望精确的结果,除了可能是余弦1,它对应于0度。

答案 2 :(得分:1)

根据标准:

  

本国际标准对准确性没有要求   浮点运算;另见18.3.2。 - 结束说明]

http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/n4606.pdf

答案 3 :(得分:0)

即使在数学上,这也是不可能的。例如,cos(2*PI)为0,但cos(4*PI)也是如此。