C ++标准保证angle == std::acos(std::cos(angle))
如果angle
在[0,Pi]范围内,或者换句话说是否可以恢复{{1}的确切原始值} angle
使用std::cos
给出上述范围限制的结果?
省略std::acos
angle
或infinity
时的边际情况。
答案 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)
也是如此。