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.
Floor和ceiling函数包括分别小于/大于或等于 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
是否接近lessThan
或moreThan
。
答案 0 :(得分:3)
由于d
始终为正,因此您可以将该转换用于整数截断(即,它是正输入的底线和负输入的上限)。
floor(d + 1)
与ceil(d) + 1 if integer, ceil(d) otherwise
相同,ceil(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是否接近或少于或等于
它应该更简单:
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
答案 1 :(得分:0)
我可以错过理解问题,但要找到最接近的整数值d:
int floored = (int)d;
int ceiled = (int)(d + 1);
int mathRounded = (int)(d + 0.5)
答案 2 :(得分:0)
我不知道你想在最后达到什么结果。
如果您想要 ceil ,发言权以及最近的:
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;
答案 3 :(得分: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);
}
答案 4 :(得分: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);