2011-12-02 59 views
0

我有一個大的數據陣列,通過採樣250千赫的電壓創建。我想打印數據以及相關時間到文件。我的第一個辦法是做這樣的(在C#):防止出現錯誤的最佳方法?

decimal dt = 1m/sampleRate; 
decimal t = 0; 

for(int i = 0; i < dataArray.Length; i++) 
{ 
    Writer.WriteLine(t + "\t" + dataArray[i]); 

    t += dt; //Would using t = i * dt; be any different? 
} 

顯然由於 浮點運算 這種方法的固有特性,它開始積累這幾秒鐘後變成顯著錯誤數據。

我對解決這個問題的辦法是這樣的:

decimal dt = (decimal)(1/sampleRate); 
decimal t = 0; 
int seconds = 0; 

for(int i = 0; i < dataArray.Length; i++) 
{ 
    if(i % sampleRate == 0) 
     { 
      t = seconds; 
      seconds++; 
     } 
    Writer.WriteLine(t + "\t" + dataArray[i]); 

    t += dt; 
} 

這使一切同步增長不夠好,但似乎並沒有特別優雅。有沒有更好的方法來解決這個問題?最後,在最上面的方法中,是否使用與小數點t = i * dt不同的t + = dt?怎麼樣與雙?

編輯:正如已經指出的,十進制不是浮點數。我應該在這裏使用小數還是雙倍?

+0

sampleRate是什麼類型? –

+0

sampleRate是一個整數,在本例中爲250000. –

+0

計算最後的比率。 – leppie

回答

1

由於您使用的是decimal,因此您是而不是在做浮點運算。 decimal基本上是一個定點數字。

+0

我的印象是小數只比雙精度更精確?我可能應該檢查一下。 –

1

您正在使用decimal,這是固定點。你不應該有任何錯誤(當然,除非你的值超出了支持的範圍decimal)。

雖然你的第一個陳述是不正確的。你正在做整數數學(將導致一個整數結果),然後鑄造成小數。你需要做的事情有點不同以強制計算:

decimal dt = 1m/sampleRate; 
+0

你可能意思是'十進制dt ...' –

+0

@SumuduFernando - 這正是我的意思!固定。太多考慮雙精度對小數。衛生署! –

+0

糟糕,我使用的實際代碼稍有不同。我甚至沒有意識到我在這裏搞砸了。我編輯了這個問題來解決這個問題。 –

相關問題