2013-10-15 77 views
1

我在調用mod函數時遇到問題。我有一個變量M,它是一個二維向量。當我打印M時,我看到M = [350,240.00]Octave mod函數和整數

這裏是問題:當我輸入mod(M(1),10)時,我獲得0這很好,但是當我輸入mod(M(2),10)時,我得到10

我不知道有沒有人遇到過這種問題或有想法。

回答

2

mod函數的說明文件中說「寫入的內容是爲整數類型返回正確的模數」。

因此,你應該值轉換爲整數應用mod之前,例如:

>> M = int64(M) 

現在

>> mod(M(2),10) 

會給你正確的答案,0

+0

問題是M是計算出來的,並不總是一個整數。我需要檢查它的座標是否是10的倍數,這是我一直選擇的測試,但如果你有另一個想法......謝謝。 – Stupidyeti

+0

'fmod'或'rem'函數返回相同的「不正確」值10.當然,如果我在命令行中輸入M = [350,240.00],則得到0,但在我的程序中不會。 – Stupidyeti

+0

你用int64轉換爲整數嗎? – piokuc

0

如果你是試圖檢查一個浮點數是否爲10的倍數,那麼你需要選擇一個精度來處理。例如240.00000000000000000000000000000000000110的倍數?這可能應該是你的情況。您需要小心,因爲您的計算機不能始終精確地表示浮點數的十進制格式,因爲它在內部存儲爲二進制格式。例如,0.1看起來十分精確,如果我做了類似0:0.1:100的事情,那麼您會希望該系列中的一些數字能夠被10完全整除。然而,0.1二進制文件是0.0001100110011001100...,這是完全需要的,它會以一些微小的精度被計算機截斷。現在,當你開始將它們全部添加到這些微小的截斷錯誤時,可能會導致你存儲諸如10.00000000000000000008989883而不是完美的10.因此,這就是爲什麼你需要選擇一個你將要使用的最低精度,並忽略下面的任何錯誤那。

我建議你四捨五入到一定的精度,然後從那裏檢查多個例如

p = 1e8 %//Check to 8 decimal points 
mod(floor(M(2)*p), 10*p)