angle == std::acos(std::cos(angle))
が範囲 [0, Pi] 内にある場合angle
、つまり、上記の範囲制限を指定して使用angle
した結果からの正確な元の値を復元することが可能であることが C++ 標準によって保証されていますか?std::cos
std::acos
angle
がinfinity
またはNaN
省略されている場合の限界ケース。
angle == std::acos(std::cos(angle))
が範囲 [0, Pi] 内にある場合angle
、つまり、上記の範囲制限を指定して使用angle
した結果からの正確な元の値を復元することが可能であることが C++ 標準によって保証されていますか?std::cos
std::acos
angle
がinfinity
またはNaN
省略されている場合の限界ケース。
Answer by StoryTeller:
std::cos
の結果が で正確に表現できない可能性があるため、標準ではその保証を行うことができず、double
の結果に影響を与える切り捨てエラーが発生しますstd::acos
。
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 を除いて、正確な結果を期待することはできません。
標準によると:
この国際規格は、浮動小数点演算の精度に要件を課していません。18.3.2も参照してください。— エンドノート]
http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/n4606.pdf
数学的にもこれは不可能です。たとえば、cos(2*PI)
は 0 ですが、 もそうですcos(4*PI)
。