0

ivarを含む「DayData」クラスを書いているとしましょう

NSString *symbol;  //such as "AAPL"
NSString *currency; //such as "USD"
NSDate *day;
double open;
double high;
double low;
double close;

最後の 4 つの ivar は、その日のその株の始値、高値、安値、終値です。

このクラスを、何十年、つまり何千日もの履歴データに沿った集中的なモンテカルロ シミュレーションの背後にある基本的なビルディング ブロック クラスとして使用しているとします。これは、シミュレーションを可能な限り高速にするために、これらの ivar に短期間で数百万回ではないにしても数千回アクセスする必要があることを意味します。

質問: double に固執する必要がありますか、それとも NSDecimalNumber を引き続き使用する必要がありますか? NSDecimalNumber は本当に速いのですか? 集中的な科学的アプリケーションのために NSDecimalNumber をテストした人はいますか?

4

3 に答える 3

2

NSDecimalNumberObj-C オブジェクトではないよりも高速でNSDecimalあるため、 のオーバーヘッドは発生しませんobjc_msgSendが、それでも 10 進演算の利点があります。sを操作する関数は次のとおりですNSDecimal

于 2010-08-19T02:27:56.723 に答える
1

ドルとセント (ただし常に1 セント単位)を扱っている場合int、セントを数えて 100 で割ってドルを得るよりも高速で効率的な方法はありません。

于 2010-08-19T02:43:46.737 に答える
1

jtbandes が言ったように、NSDecimal速度が必要な場合は使用する必要があります。これNSDecimalNumberは、Obj-C オブジェクト ラッパーNSDecimalです。NSDecimalは、10 進数を表すために使用される構造体です。これにより、2 進数 -> 10 進数の丸めおよび表現エラーを発生させない計算を行うことができます。

シミュレーションなので、最後の 1 オンスの精度はおそらく問題にならないでしょdoubleう (おそらく、シミュレーションには近似が含まれているため、わずかなエラーはあまり影響しません)。浮動小数点計算の落とし穴に注意する必要があります。特に、2 つの浮動小数点数の大きさが非常に異なる場合や、非常に近い数値から 1 つの数値を減算する場合など、特定のタイプの演算では、より大きなエラーが発生する可能性があります。ウィキペディアのこのページでは、いくつかの落とし穴について説明しています。

于 2010-08-19T02:44:12.703 に答える