Экспоненциальные вычисления по приближению в исходном коде ядра 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)).