基本上,看起来这是预期的行为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);
}