如何检查Math.cos(角度)= 0

时间:2015-02-24 15:47:28

标签: c#

我正在尝试找到tan函数的正确域名,我知道

tan x = sinx / cos x
tan时,

cos x = 0未定义。所以

我正在尝试检查cos x是否为0。

 if ( Math.Cos(x).Equals(0) )
 {
     // do stuff
 }

但这绝不是真的,因为Math.Cos返回6.123....E-17 如何检查cos == 0?

3 个答案:

答案 0 :(得分:11)

您需要稍微扩大您的期望 - 为了使Math.Cos(x)真正等于0,您需要Cos中的不准确(当然会发生这种情况)或者x有一个无理的价值。

相反,您应该计算出一些容差 - Math.Cos的某些值范围非常接近为0.例如:

if (Math.Abs(Math.Cos(x)) < 1e-15)

1e-15几乎是任意挑选的 - 你应该找出你想要的特定任务。 (这仍然会给出非常大的tan值,当然......)

答案 1 :(得分:4)

如果您的问题是从Math.Tan收到异常,则Math.Tan不会抛出。它唯一能做的就是返回Double.NaN和(也许)Double.PositiveInfinity / Double.NegativeInfinity,所以只需检查它们:

double t = Math.Tan(something);

if (!double.IsInfinity(t) && !double.IsNaN(t))
{
    // Do Something
}

答案 2 :(得分:2)

问题在于您需要不直接比较它,但由于浮点值在内存中的表示方式具有一定的准确性。

您可以使用以下代码修复它:

const double Epsilon = 0.0001;

if (Math.Cos(x) < Epsilon)
{
    // Code here
}

此外,编写Math.Cos(x).Equals(某些东西)没有意义,因为它使代码更难阅读。

如果您想了解更多关于代码无法运作的信息,可以在此处查找:http://www.parashift.com/c++-faq/floating-point-arith.html

这是C ++的常见问题解答,但同样适用于您的情况。