3

たとえば、NASDAQ のインデックスを計算しています。

すべての株価は 10 進数です。重みを 10 進数または 2 倍にすることができます。問題ありません。

ナスダック = 重量 1 * 在庫 1 + 重量 2 * 在庫 2 + .... + 重量 n * 在庫 n.

株価は小数であるため、ナスダック指数を小数にするのは理にかなっているようです。しかし、株式が更新されるたびにナスダック指数を再計算したくありません。代わりに、以前の値を「キャッシュ」してから、差のみを計算したいと考えています。たとえば、stock2 が変更された場合、次のようになります。

stock2OldPrice = stocks[2];
diff = stock2 - stock2OldPrice
nasdaq += diff * weight2     // need to synchronize
stocks[2] = stock2

株式は同時に更新できるため、ナスダック指数を同期する必要があります。たとえば、MSFT と INTC の新しい価格を並列スレッドで受け取ることができます。したがってInterlocked.Add(ref nasdaq, diff * weight2);、以前の質問を参照して、ロックフリーコードを使用して異なるスレッドから追加を同期する方法を書かなければなりませんか? ただしdecimal、小数がサポートされていないため、それはできません。

それでは、nasdaqindex をdouble?として宣言してみましょう。double を使用して実行できますInterlocked.Addが、別の問題が発生しました。すべてのステップで 10 進数から double に変換するため、精度が失われます。そして、私の「スマートキャッシングアルゴリズム」は絶対に「正確」ではありません。これは、100 000 000 の更新後にインデックスの値が完全に間違ったものになることを意味し、それに対処することはできません。

したがって、使用することもdouble、どちらも使用することもできませんdecimal

decimal考えられる解決策は1つだけです。「スマートキャッシングアルゴリズム」を使い続けることができるように、ナスダックインデックスを宣言する必要があるため、より複雑な「同期」メカニズムを使用する必要があり、おそらくスピンロックを使用する必要があります。

おそらく、より簡単な解決策を見ることができますか?

4

0 に答える 0