我試圖找到該tan
功能正確的域名,我知道如何檢查是否Math.cos(角)= 0
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
如何O檢查的COS == 0?
我試圖找到該tan
功能正確的域名,我知道如何檢查是否Math.cos(角)= 0
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
如何O檢查的COS == 0?
您需要擴大您的期望一點 - 爲了Math.Cos(x)
是真正等於0,你要麼需要在Cos
不準確(這會發生,當然)或x
有一個非理性的價值。
相反,你應該制定出一些寬容 - 爲Math.Cos
一些數值範圍,其是非常接近爲0。例如:
if (Math.Abs(Math.Cos(x)) < 1e-15)
這1e-15
拾取非常隨意 - 你應該制定出你想讓它成爲你特定的任務。 (這當然會給出相當大的值tan
...)
如何使用'double.Epsilon'? – user1620220 2015-02-24 15:52:14
'double.Epsilon'太小了。 – 2015-02-24 15:53:12
http://stackoverflow.com/questions/328475/should-we-compare-floating-point-numbers-for-equality-against-a-relative-error – 2015-02-24 15:53:16
問題是,您需要比較它不是直接的,但由於事實如何在內存中表示浮點值,因此具有一定的準確性。
您可以通過使用像這樣的一些代碼修正:
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++常見問題解答,但同樣的事情適用於你的情況。
如果您的問題正在從Math.Tan收到例外,Math.Tan
不會丟失。它可以做的唯一的事情就是返回Double.NaN
和(也許)Double.PositiveInfinity
/Double.NegativeInfinity
,所以只需查詢到:
double t = Math.Tan(something);
if (!double.IsInfinity(t) && !double.IsNaN(t))
{
// Do Something
}
因爲這種採用雙精度,你應該加上一個合理的誤差範圍。 – 2015-02-24 15:49:24
奇怪的是,之前沒有人試圖比較雙打...... http://www.bing.com/search?q=C%23+double+compare似乎正在產生一些結果 - 可能這不是第一次.. – 2015-02-24 15:56:15
只有當參數正好是+/- pi/2時,它纔會恰好爲0。從來沒有,浮點數沒有足夠的準確性。 – 2015-02-24 15:59:47