2015-02-24 46 views
4

我試圖找到該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?

+0

因爲這種採用雙精度,你應該加上一個合理的誤差範圍。 – 2015-02-24 15:49:24

+0

奇怪的是,之前沒有人試圖比較雙打...... http://www.bing.com/search?q=C%23+double+compare似乎正在產生一些結果 - 可能這不是第一次.. – 2015-02-24 15:56:15

+1

只有當參數正好是+/- pi/2時,它纔會恰好爲0。從來沒有,浮點數沒有足夠的準確性。 – 2015-02-24 15:59:47

回答

11

您需要擴大您的期望一點 - 爲了Math.Cos(x)是真正等於0,你要麼需要在Cos不準確(這會發生,當然)或x有一個非理性的價值。

相反,你應該制定出一些寬容 - 爲Math.Cos一些數值範圍,其是非常接近爲0。例如:

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

1e-15拾取非常隨意 - 你應該制定出你想讓它成爲你特定的任務。 (這當然會給出相當大的值tan ...)

+0

如何使用'double.Epsilon'? – user1620220 2015-02-24 15:52:14

+2

'double.Epsilon'太小了。 – 2015-02-24 15:53:12

+0

http://stackoverflow.com/questions/328475/should-we-compare-floating-point-numbers-for-equality-against-a-relative-error – 2015-02-24 15:53:16

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++常見問題解答,但同樣的事情適用於你的情況。

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 
} 
相關問題