0

バイナリ値が大きすぎます。

 value1 : 2 ^ 300,000.
 value2 : 2 ^ 300,000.

value1とvalue2の「と計算」をしたいです。

まず、value1 と value2 を格納するにはどうすればよいでしょうか。(int、float、double... ???)

 int value1 = 2 ^ 300000;

これは正しいです?

この方法は値を完全に保存しますか?

使用するためのコンテキスト)
300,000 要素を持つ 2 つの配列があります。

eg) array1 @ [@ "apple", @ "banana", @ "iphone", @ "TV", @ "clock" .... <= it has 300, 000.
    array2 @ [@ "fruit", @ "fruit", @ "electric", @ "electric", @ "electric" ....] <= also has 300,000.

好きなものをバイナリに
表示 : 1,1,0,0,1 ... 好きな種類をバイナリに表示 : 1,1,0,0,0 ...

array1 & array2 の and を計算した結果 : 1,1,0,0,0 ...
果物の「りんご」と「バナナ」が好きです。

バイナリ計算を使用する理由は、他の方法よりも高速であることが期待されます。

4

3 に答える 3

2

まず、Objective-C クラスではなく、POD とも呼ばれる Plain Old Datatype を使用していることです。

その大きな値は、64 ビットの unsigned int であっても、整数の制限をはるかに超えています。私は数学の達人ではないので、それが double に収まるかどうかはわかりませんが、浮動小数点を使用すると精度が失われるため、それは問題ではありません。(確実に適合しない正確な値については、WolframAlpha へのリンクを参照してください。)

あなたが望むのは、おそらくNSDecimalNumber最大 38 桁の精度を提供するものであり、それがライブラリに組み込まれているものです。さらに精度が必要な場合は、独自のクラスを作成するか、GMPなどのライブラリをチェックアウトできます。

NSDecimalNumber hereについて良い質問と回答があります。

更新: Craig がコメントで述べたように、独自のクラスをロールして計算を高速化することができます。GMP のようなライブラリは汎用であり、非常に安全な方法で計算を行うため、実行したい計算が単純化されるため、時間を無駄にすることがあります。

于 2013-08-30T11:43:26.203 に答える
0

300,000 個のオブジェクトがある場合、Core Data などのデータベースの使用を検討しましたか? 非常に大きなビット マスクの代わりに、単一のデータベース (コア データ) 要求で同じことを行う方が簡単かもしれません。

特定の質問に答えるには、整数の C 配列がおそらく最良の解決策です。

const NUM_OBJECTS = 300000;
//8 * sizeof(int) bits per an int
int* mask = malloc((size_t) ceilf(NUM_OBJECTS / (sizeof(int) * 8.0f));
于 2013-08-30T13:21:07.370 に答える