6

コードベースのユーティリティヘッダーに次のマクロが見つかりました。

#define CEILING(x,y) (((x) + (y) - 1) / (y))

これ(この回答の助けを借りて)私は次のように解析しました:

// Return the smallest multiple N of y such that:
//   x <= y * N

しかし、このマクロがコードベースでどのように使用されているかをどれだけ見つめても、そのような操作の価値を理解することはできません。使用法はコメントされていません。これは、それが何か明らかなことを示しているようです。

誰かがこのマクロのユースケースの英語の説明を提供できますか?それはおそらく盲目的に明白です、私はそれを見ることができません...

4

5 に答える 5

5

メモリをチャンクで割り当てたいとしましょう(キャッシュライン、ディスクセクターを考えてみてください)。Xバイトを含む整数個のチャンクを保持するには、どのくらいのメモリが必要ですか?チャックサイズがYの場合、答えは次のとおりです。CEILING(X,Y)

于 2012-07-06T13:47:16.300 に答える
5

このようにCで整数除算を使用する場合

y = a / b

除算の結果はゼロに向かって丸められます。つまり5 / 2 == 2-5 / 2 == -2。別の方法で丸めることが望ましい5 / 2 == 3場合があります。たとえば、バイトを保持するために最小の整数配列サイズを使用するn場合n / sizeof(int)、余分なバイトを保持するスペースが必要なため、切り上げる必要があります。

したがって、このマクロはまさにこれを実行します。CEILING(5,2) == 3ただし、正のy場合にのみ機能することに注意してください。注意してください。

于 2012-07-06T13:47:34.927 に答える
4

うーん...英語の例...バナナは5つの束でしか購入できません。バナナを欲しがっている人は47人います。何束必要ですか?回答=CEILING(47,5)=((47 + 5)-1)/ 5 = 51/5 = 10(余りを削除-整数除算)。

于 2012-07-06T13:56:43.467 に答える
3

いくつかのテスト値を試してみましょう

CEILING(6, 3) = (6 + 3 -1) / 3 = 8 / 3 = 2 // integer division
CEILING(7, 3) = (7 + 3 -1) / 3 = 9 / 3 = 3
CEILING(8, 3) = (8 + 3 -1) / 3 = 10 / 3 = 3
CEILING(9, 3) = (9 + 3 -1) / 3 = 11 / 3 = 3
CEILING(10, 3) = (9 + 3 -1) / 3 = 12 / 3 = 4

ご覧のとおり、マクロの結果は整数であり、z以下を満たす最小のものですz * y >= x

シンボリックスも試すことができます。

CEILING(k*y, y) = (k*y + y -1) / y = ((k+1)*y - 1) / y = k
CEILING(k*y + 1, y) = ((k*y + 1) + y -1) / y = ((k+1)*y) / y = k + 1
CEILING(k*y + 2, y) = ((k*y + 2) + y -1) / y = ((k+1)*y + 1) / y = k + 1
....
CEILING(k*y + y - 1, y) = ((k*y + y - 1) + y -1) / y = ((k+1)*y + y - 2) / y = k + 1
CEILING(k*y + y, y) = ((k*y + y) + y -1) / y = ((k+1)*y + y - 1) / y = k + 1
CEILING(k*y + y + 1, y) = ((k*y + y + 1) + y -1) / y = ((k+2)*y) / y = k + 2

これを使用して、定数の倍数のサイズでメモリを割り当てたり、画面を埋めるために必要なタイルの数を決定したりできます。

ただし、気を付けてください。これは正の場合にのみ機能しyます。

それが役に立てば幸い。

于 2012-07-06T13:49:15.333 に答える
2

CEILING(x,y)(数学的な除算)y > 0の上限を仮定すると、あなたに与えます。x/yその使用例の1つは、オフセットで始まる素数ふるいです。ここでは、ふるい範囲xの素数のすべての倍数を複合材料としてマークします。y

于 2012-07-06T13:47:29.250 に答える