2011-05-30 78 views
0

這是我用2 * M_PI檢查數字的可分性所做的工作。 「w」是2/3的常數,t是變量t + = dt的變量,其中dt爲0.1。我試圖使用mod運算符%來查看是否有可分割的東西。但它不工作。如何檢查一個數字是否可以被2 * M_PI整除在C++中?

bool divisible; real w = 2/3; real t;

if((w*t) % 2*M_PI == 0) 
    { 
     divisible = true; 
    } 

else 
    { 
     divisible = false; 
    } 

這是我得到的,「類型‘真實’和‘INT’的無效操作數爲二進制‘操作符%’」

這是什麼意思的錯誤?我如何得到這個工作?那麼我需要讓w和t成爲int嗎?它們不能是因爲w是2/3,並且t從0增加0.1。有人可以幫幫我嗎?

+0

只要檢查'cos(w * t)== 0';) – MSalters 2012-12-10 11:00:19

回答

3

改爲使用std::fmod,它運行在雙打而不是整數%運營商。

+2

並注意舍入誤差,即不要使用'=='進行比較,而是看看您是否在所需值的可接受的ε內。 – Waldheinz 2011-05-30 10:09:14

+0

我正在編譯錯誤,w是雙精度型,t是雙精度型,而M_PI是我認爲的浮點數?應該,fmod((w * t)/(2 * M_PI))是否工作? – QEntanglement 2011-05-30 10:21:39

+0

@QEntanglement,你看過這個函數的簽名嗎?我故意留下了一個鏈接(即爲你做一個側面思考!)) – Nim 2011-05-30 10:23:32

2

「%」是整數模運算符不工作的浮動/ double參數/操作數

有存在於文件math.h浮法/雙MODF功能這可能有助於

  • 一個示例可以是在例如
+0

'modf'不是一個模運算,它只是把double分解爲整數和小數部分。 – Nim 2011-05-30 10:11:50

+0

要使用modf,必須先執行另一個步驟: – Uhli 2011-05-30 12:08:51

+0

函數modf調用中使用的第一個參數的計算步驟:double arg1 =(w * t)/ 2 * M_PI。如果結果(小數部分)等於或接近0.0,則可變整除(在問題的示例中)必須設置爲true。別忘了 - 結果受有限浮點精度的影響,可能會斷言M_PI不等於0! – Uhli 2011-05-30 12:21:45

2

爲什麼你想知道如果一個浮點數是正是被另一個整除?

浮點運算不應用於「精確」計算。每個操作的結果都是嚴格定義的,但它不同於同一操作的數學意義。 特別是:

double a = 1e20; 
double b = 1e-20; 

double c = (a + b) - a; 

你可能會以爲c將等於b,但實際上它不會!

您應該只將浮點數與某個窗口進行比較。意思是 - 特定的浮點值是否在某個有限長度範圍內。

相關問題