我正在尝试找到tan
函数的正确定义域,我知道
tan x = sinx / cos x
当cos x = 0
时,tan
是未定义的。因此,我正在尝试检查cos x
是否为0。
if ( Math.Cos(x).Equals(0) )
{
// do stuff
}
但这并不是真的,因为 Math.Cos 返回 6.123....E-17
。如何检查 cos == 0?
我正在尝试找到tan
函数的正确定义域,我知道
tan x = sinx / cos x
当cos x = 0
时,tan
是未定义的。因此,我正在尝试检查cos x
是否为0。
if ( Math.Cos(x).Equals(0) )
{
// do stuff
}
但这并不是真的,因为 Math.Cos 返回 6.123....E-17
。如何检查 cos == 0?
你需要稍微扩大一下期望范围 - 为了让Math.Cos(x)
真正等于0,你要么需要在Cos
中出现不准确性(当然这种情况会发生),要么就需要x
具有无理数值。
相反,你应该计算出一些容差 - 一些非常接近0的Math.Cos
数值范围。例如:
if (Math.Abs(Math.Cos(x)) < 1e-15)
那个1e-15
基本上是任意选定的 - 你应该计算出你特定任务所需的值。(当然,这仍会产生相当巨大的tan
值......)
double.Epsilon
怎么样? - user1620220double.Epsilon
太小了。 - Matthew Watsondouble.Epsilon
和 -double.Epsilon
是在 double.Epsilon
范围内的...并且我不确定是否存在一个 double
值 x
使得 Cos(x)
是这三��值之一。 - Jon Skeet1e-15
)往往取决于后续计算的性质。在某些情况下(多重导数等),为了避免随后的计算中数字爆炸,您实际上必须比其他情况更早地截断。您的整个系统将具有“一般可计算”的域,您通常需要在每种情况下确定该域是什么。 - J...如果您遇到了从Math.Tan接收异常的问题,那么需要说明的是,Math.Tan
不会抛出异常。它能够做的唯一一件事是返回Double.NaN
以及(也许)Double.PositiveInfinity
/Double.NegativeInfinity
,所以只需要检查它们即可:
double t = Math.Tan(something);
if (!double.IsInfinity(t) && !double.IsNaN(t))
{
// Do Something
}
问题在于你需要进行比较,但由于浮点数在内存中的表示方式,你不能直接进行比较,需要有一定的精度。
你可以使用以下代码来解决这个问题:
const double Epsilon = 0.0001;
if (Math.Cos(x) < Epsilon)
{
// Code here
}