Экспоненциальные вычисления по приближению в исходном коде ядра Linux

Я должен немного изменить алгоритм TCP в исходном коде ядра Linux. В нем я должен вычислить окно перегрузки следующим образом:

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 ответ

Помимо вопроса использования или отсутствия чисел с плавающей запятой в режиме ядра, приближение не является звездным, поскольку оно не сохраняет положительности. Для этого использования

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))

который равен 0 для x=0, 1 для x=1 и монотонно увеличивается между ними. Если x=p/q является рациональным и целым числом, результирующее рациональное выражение

p/(p+a*(q-p)).
Другие вопросы по тегам