我正在尝试找到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?
答案 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 ++的常见问题解答,但同样适用于您的情况。