计算最大功率,使结果在限制范围内

时间:2017-08-01 14:51:52

标签: c# exponential pow

我目前正在进行指数衰减(http://www.acodersjourney.com/2016/02/26-handle-transient-errors-in-c/)实施。

我计算等待的延迟,这样:

var delay = (int) Math.Round(Math.Pow(timeBetweenAttempts, attempt), MidpointRounding.AwayFromZero);

显然,这种延迟开始变得非常大,非常快,即使尝试之间的时间是10毫秒。

我希望能够做类似的事情:

var maxTimeBetweenAttempts = 5000; // 5 seconds is the hard limit
var nominalTimeBetweenAttempts = 10;

var maxNumberOfAttempts = // calculate the maximum number of raises that would hold below 5000.

显然这可以使用循环来计算,但我想知道是否有更优雅的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

取幂的倒数是对数,所以你可以使用它。 你会用

if (attempt < Math.Log(maxTimeBetweenAttempts) / Math.Log(nominalTimeBetweenAttempts))
{
    Retry(++attempt);
}

在四舍五入后查看尝试是否低于阈值。

然而,由于这需要额外的计算并且稍微不那么明显(因为它使用对数数学,大多数人自学校以来没有看过事件)而不仅仅是指数,我个人建议只计算功率和测试这一点。

if(Math.Pow(nominalTimeBetweenAttempts, attempt) < maxTimeBetweenAttempts)
{
    Retry(++attempt);
}

修改

重新阅读您的问题,您明确声明您想知道在达到一定长度之前的最大重试次数。那将是:

var maximumNumberOfAttempts = Math.Floor(Math.Log(maxTimeBetweenAttempts) / Math.Log(nominalTimeBetweenAttempts))