0

250 kHz で電圧をサンプリングして作成した大きなデータ配列があります。関連する時間とともにデータをファイルに出力したいと思います。私の最初のアプローチは、次のようにすることです(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 += dt を t = i * dt と小数で使用していますか? ダブルではどうですか?

編集:指摘されているように、10 進数は浮動小数点ではありません。ここで10進数または2倍を使用する必要がありますか?

4

2 に答える 2

1

を使用しdecimalているため、浮動小数点演算を行ってい ません。decimalは基本的に固定小数点数です。

于 2011-12-02T20:23:12.930 に答える
1

を使用していますがdecimal、これは固定小数点です。エラーが発生することはありません (もちろん、値が のサポートされている範囲外でない限りdecimal)。

ただし、最初のステートメントは正しくありません。あなたは整数計算を行っており( with は整数の結果になります)、次に小数にキャストしています。計算を適切に強制するには、少し異なることを行う必要があります。

decimal dt = 1m / sampleRate;
于 2011-12-02T20:26:09.993 に答える