Linux内核源代码中的近似指数计算

时间:2014-04-29 16:18:00

标签: c math linux-kernel exponential approximation

我必须在Linux Kernel的源代码中修改一点TCP算法。 在其中,我必须按如下方式计算拥塞窗口:

cwnd = cwnd (1-x^alpha)     where alpha and x are float type and satisfy 0<x<1, alpha >0.

通常,必须使用#include Math.h和pow()函数,对吧?

但我不知道指数计算是否会使操作变慢。

所以,我想到了伯努利的不平等

(1-a)^x < 1-ax          where 0<a<1

所以在我的情况下,我可以通过使用伯努利来计算近似值。

x^alpha = (1-(1-x))^alpha ~ 1 - alpha(1-x)

如果这不行,那么还有什么办法吗? 请帮帮我。

1 个答案:

答案 0 :(得分:1)

除了在内核模式下使用或不使用浮点数的问题之外,近似并不是那么明显,因为它不能保持积极性。为此用途

x^a = 1/(1/x)^a = 1/(1+u)^a approx 1/(1+a*u)

其中1 / x大于或等于1,因此近似中的所有项都为正。重新插入u = 1 / x-1给出

x^a approx x/(x+a*(1-x))

对于x = 0是0,对于x = 1是1并且在它们之间单调增加。如果x = p / q是有理数且是整数,则得到的有理表达式为

p/(p+a*(q-p)).