3

Is it guaranteed by the C++ standard that angle == std::acos(std::cos(angle)) if angle is in the range [0, Pi], or in other words is it possible to restore the exact original value of angle from the result of std::cos using std::acos given the mentioned range limit?

The marginal cases when angle is infinity or NaN are omitted.

4

4 回答 4

3

来自 cppreference.com:

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

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

在该范围之外,您甚至无法获得大致的对应关系。计算余弦会丢弃有关您在该范围之外的角度的信息。没有办法取回这些信息。

如何丢弃信息:

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

此外,尽管所有读者可能都知道这一点,但为了完整性:由于正弦是余弦是非常无理数,通常不是简单的分数,除了余弦 1,它对应于 0 度之外,你不能期望得到精确的结果。

于 2016-10-15T16:15:04.157 回答
3

故事讲述者的回答:

标准不能保证,仅仅因为 的结果std::cos可能不能用 a 精确表示double,所以你会得到一个截断错误,这会影响 的结果std::acos

于 2016-10-15T15:54:39.957 回答
1

According to the standard:

This International Standard imposes no requirements on the accuracy of floating-point operations; see also 18.3.2. — end note ]

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

于 2016-10-15T16:21:06.243 回答
0

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

于 2016-10-15T16:16:50.580 回答