gpt4 book ai didi

c# - 整数除法

转载 作者:行者123 更新时间:2023-11-30 16:56:26 27 4
gpt4 key购买 nike

在 C# 中是否有一种简单、高效和正确(即不涉及到/从 double 转换)的方法来进行floored integer division(例如 Python offers)。

换句话说,以下内容的高效版本不会遭受长/双转换损失。

(long)(Math.Floor((double) a / b))

还是必须自己实现,例如

static long FlooredIntDiv(long a, long b)
{
if (a < 0)
{
if (b > 0)
return (a - b + 1) / b;
// if (a == long.MinValue && b == -1) // see *) below
// throw new OverflowException();
}
else if (a > 0)
{
if (b < 0)
return (a - b - 1) / b;
}
return a / b;
}

<罢工>*) 尽管除法运算符的 C# 4 规范 leaves it open是否OverflowException内部凸起unchecked ,实际上它确实抛出(在我的系统上)和 Visual Studio .NET 2003 version甚至强制它抛出:

If the left operand is the smallest representable int or long value and the right operand is –1, [..] System.OverflowException is always thrown in this situation, regardless of whether the operation occurs in a checked or an unchecked context.

<罢工>

编辑

划掉关于checked的陈述和 unchecked一切都很好,但是 checked实际上只是一个compile time concept ,所以不管调用该函数的代码是否在 checked 中,我的函数是应该回绕还是抛出都取决于我。还是不是。

最佳答案

你可以试试这个:

if (((a < 0) ^ (b < 0)) && (a % b != 0))
{
return (a/b - 1);
}
else
{
return (a/b);
}

编辑(在下面的评论中进行一些讨论之后):

如果不使用 if-else,我会这样:

return (a/b - Convert.ToInt32(((a < 0) ^ (b < 0)) && (a % b != 0)));

注意:Convert.ToIn32(bool value) 也需要跳转,参见implemention方法:

return value? Boolean.True: Boolean.False;

理论上,不可能计算 a = long.MinValueb = -1L 的除法,因为预期结果是 a/b = abs(long.MinValue) = long.MaxValue + 1 > long.MaxValue。 (long 的范围是 –9,223,372,036,854,775,8089,223,372,036,854,775,807。)

关于c# - 整数除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28059655/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com