C++标准是否保证angle == std::acos(std::cos(angle)) (如果angle在0,Pi范围内),或者换句话说,是否有可能在给定所述范围限制的情况下,从std::cos的结果中恢复angle的确切原始值?
忽略了angle为infinity或NaN的边缘情况。
发布于 2016-10-15 15:54:39
StoryTeller的回答:
标准不能保证这一点,仅仅因为
std::cos的结果可能不能精确地由double表示,因此您将得到一个截断错误,这将影响std::acos的结果。
发布于 2016-10-15 16:15:04
来自cppreference.com:
如果没有出现错误,“将返回arg的弧余弦(arccos(arg))在0;π范围内。
以度为单位,这是0到180,包括在内,对应于余弦值1向下到-1,包括在内。
在这个范围之外,你甚至无法得到一个近似的通信。计算余弦会丢弃关于你在这个范围之外的角度的信息。没有办法把这些信息拿回来。
如何丢弃信息:
首先,对于任意整数K,cos(x) = cos(K*360 + x),其次,cos(x) = cos(-x)。这将产生大量的角值,产生相同的余弦值。
而且,尽管所有读者都可能知道这一点,但为了完整起见:因为正弦曲线是非常无理数,一般不是简单的分数,所以除了余弦1,它对应于0度,你也不能期望得到精确的结果。
发布于 2016-10-15 16:21:06
根据标准:
本国际标准不对浮点运算的准确性提出任何要求;另见18.3.2。-尾注]
http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/n4606.pdf
https://stackoverflow.com/questions/40061120
复制相似问题