5
double d = 0; // random decimal value with it's integral part within the range of Int32 and always positive.
int floored = (int) Math.Floor(d); // Less than or equal to.
int ceiled  = (int) Math.Ceiling(d); // Greater than or equal to.
int lessThan = ? // Less than.
int moreThan = ? // Greater than.

下限関数と天井関数には、それぞれ以下/以上の最大/最小整数が含ま dます。それぞれより小さい/大きいが等しくない d最大/最小の整数を見つけたいです。

もちろん、これはいくつかの方法で実現できますがif's and but's、この操作はアルゴリズムで何十億回も実行されるため、分岐を含まないか、少なくとも非常に高速な方法を探しています。

バイナリ操作は可能ですか? そうでない場合、最良の代替手段は何ですか?

明らかな解決策は次のようになります。

int lessThan = (d - floored) > double.Epsilon ? floored : (floored-1);
int moreThan = (ceiled - d) > double.Epsilon ? ceiled : (ceiled+1);

: 目的は、 がまたはdに近いかどうかを調べることです。lessThanmoreThan

4

5 に答える 5

3

は常に正であるためd、整数切り捨てへのキャストを使用できます (つまり、正の入力の場合は下限、負の入力の場合は上限です)。

floor(d + 1)と同じですceil(d) + 1 if integer, ceil(d) otherwiseceil(d - 1)同じですfloor(d) - 1 if integer, floor(d) otherwise

int moreThan = (int)(d + 1); // floor(d + 1)
int lessThan = int.MaxValue + (int)((d - int.MaxValue) - 1) // ceil(d - 1)

やや複雑ですが、他のlessThan誰かがより良いアイデアを持っていても驚かないでしょう。

しかし、あなたはこれが欲しいので:

目的は、d が lessThan に近いか moreThan に近いかを調べることです

それはさらに簡単なはずです:

double x = d % 1;
if (x == 0 || x == 0.5)
    // d is equally far from either one, either by a difference of 1 or of 0.5
else if (x < 0.5)
    // d is closer to lessThan
else
    // d is closer to moreThan
于 2012-08-12T15:22:29.693 に答える
0

質問を誤解する可能性がありますが、dの最も近い整数値を見つけるには:

int floored = (int)d;
int ceiled = (int)(d + 1);
int mathRounded = (int)(d + 0.5)
于 2012-08-12T15:15:53.773 に答える
0

最終的にどのような結果を達成したいのかわかりません。

ceilfloor 、および最も近いものが必要な場合:

int lessThan = (int) Math.Floor(d); // Less than or equal to.
int moreThan = (int) Math.Ceiling(d); // Greater than or equal to.

// 1 comparison instead of 2 that is made on your question.
if (lessThan == moreThan)
{
    lessThan--;
    moreThan++;
 }

 bool isCloserToFloor = (d - .5) < lessThan;
 bool isCloserToCeil = !isCloserToFloor;
于 2012-08-12T15:22:12.010 に答える
0

これをパフォーマンスでテストしていませんが、double が既に整数であるかどうかをテストしてから、適切な操作を実行できます。

double d = 0;
int lessThan;
int moreThan;

if (d % 1 == 0)
{
    lessThan = d - 1;
    moreThan = d + 1;
}
else
{
    lessThan = (int) Math.Floor(d);
    moreThan  = (int) Math.Ceiling(d);
}
于 2012-08-12T15:27:21.790 に答える
0

少しごまかすことができます: Convert.ToInt32(bool) を使用します:

double d = 0; // random decimal value with it's integral part within the range of Int32 and always positive.
int floored = (int) Math.Floor(d); // Less than or equal to.
int ceiled  = (int) Math.Ceiling(d); // Greater than or equal to.
int lessThan = floored - Convert.ToInt32(Math.Abs(d-floored) < epsilon);
int moreThan = ceiled + Convert.ToInt32(Math.Abs(d-ceiled) < epsilon);
于 2012-08-12T15:35:50.410 に答える