3

angle == std::acos(std::cos(angle))が範囲 [0, Pi] 内にある場合angle、つまり、上記の範囲制限を指定して使用angleした結果からの正確な元の値を復元することが可能であることが C++ 標準によって保証されていますか?std::cosstd::acos

angleinfinityまたはNaN省略されている場合の限界ケース。

4

4 に答える 4

3

Answer by StoryTeller:

std::cosの結果が で正確に表現できない可能性があるため、標準ではその保証を行うことができず、doubleの結果に影響を与える切り捨てエラーが発生しますstd::acos

于 2016-10-15T15:54:39.957 に答える
3

cppreference.com から:

エラーが発生しない場合、 [ acos return] arg の逆余弦 (arccos(arg)) の範囲 [0 ; ] π]

度数で表すと、これは 0 から 180 までであり、1 から -1 までの余弦値に対応します。

その範囲外では、おおよその対応を取得することさえできません。コサインを計算すると、その範囲外の角度に関する情報が破棄されます。その情報を取り戻す方法はありません。

情報の破棄方法:

まず、任意の整数 K に対して cos(x) = cos(K*360 + x) を度単位で表します。次に、cos(x) = cos(-x) です。これにより、同じコサイン値を生成する非常に多くの角度値が加算されます。

また、すべての読者がこれを知っている可能性がありますが、完全を期すために: 正弦は余弦は非常に無理数であり、一般に単純な分数ではないため、0 度に対応するおそらく余弦 1 を除いて、正確な結果を期待することはできません。

于 2016-10-15T16:15:04.157 に答える
1

標準によると:

この国際規格は、浮動小数点演算の精度に要件を課していません。18.3.2も参照してください。— エンドノート]

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 に答える