基本的に、これは から期待される動作のようMath.Tan
です。私は他の言語をよく知らないので、これが浮動小数点演算の通常の動作なのか、C# の実装に固有なのかはわかりません。(注: その後、Google のオンライン計算機が同じ結果を返すことがわかりました。これは、おそらくpiが無理数であるという事実と倍精度データ型の制限に関連して、浮動小数点三角関数の動作が予想されることを示唆しています)
ただし、この結果から逆方向に作業するMath.Atan(// your result);
と、Math.Atan(double.PositiveInfinity)
両方とも 90 度が返されます。これは予想されることでしょうか?
これが私のテストです:
var deg = 90.0;
var rads = deg * (Math.PI / 180);
var result = Math.Tan(rads);
if (Double.IsInfinity(result))
Console.WriteLine("Tan of 90 degrees is Infinity");
else if (Double.IsNaN(result))
Console.WriteLine("Tan of 90 degrees is Undefined");
else
Console.WriteLine("Tan of 90 degrees is {0}", result);
Console.WriteLine("Arc Tan of {0} is {1} degrees", double.PositiveInfinity, Math.Atan(double.PositiveInfinity) * 180 / Math.PI);
Console.WriteLine("Arc Tan of {0} is {1} degrees", result, Math.Atan(result) * 180 / Math.PI);
次の出力が得られます。
Tan of 90 degrees is 1.63317787283838E+16
Arc Tan of Infinity is 90 degrees
Arc Tan of 1.63317787283838E+16 is 90 degrees
したがって、私の推測では、誰かが介入して回避策を提供できない限り、正しい結果を得るにはエッジ ケースとしてこれを回避するようにプログラムする必要があるかもしれません。
任意の三角関数の「正しい結果」は の精度 (double
有効数字 15 桁) に制限されるため、それ以上の精度が必要な場合は、より正確な数学をサポートするライブラリを見つける必要があります。
望ましくない応答を提供しているように見えるのでMath.Tan(Math.PI/2)
、次のようなことができます:
public double ComputeTangent(double angleRads)
{
if (angleRads == Math.PI/2)
return double.PositiveInfinity
if (angleRads == - Math.PI/2)
return double.NegativeInfinity
return Math.Tan(angleRads);
}