2014-04-29 3 views
1

리눅스 커널의 소스 코드에서 약간의 TCP 알고리즘을 수정해야합니다. 다음과 같은 그것에서 , 나는 정체 창을 계산해야한다 :리눅스의 근사에 의한 지수 계산 커널의 소스 코드

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

일반적으로, 하나는 오른쪽 Math.h 및 펑() 함수를 인클루드하고 사용할 수있다?

그러나 지수 계산으로 인해 작업 속도가 느려질 지 모르겠습니다.

그래서, 나는, 베르누이의 불평등 내 경우에 따라서

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

생각 나는 베르누이을 사용하여 계산을 근사 할 수입니다.

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

그렇다면 괜찮은 방법이 있습니다. 도와주세요.

+0

아마도 최악의 경우의 근사값 오류의 결과는 무엇인지 스스로 자문해야합니다. 누군가이 문제를 아직 해결하지 않았습니까? –

+2

또한, 커널의 부동 소수점은 일반적으로 매우 강하게 낙심됩니다 ... 금지 된 경우에도 ... – twalberg

+2

... 그리고 정당한 이유가 있습니다. 커널 모드로 전환해도 프로그램의 부동 소수점 상태는 저장되지 않습니다 (커널 모드 스위치를 더 비싸게 만들 수 있습니다 ...). – EOF

답변

1

커널 모드에서 부동 소수점 숫자를 사용하거나 사용하지 않는 질문과 별개로, 근사값은 양성을 유지하지 않으므로 별 모양이 아닙니다. 그 사용할

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

1/X는 1보다 크거나 동일하고, 이에 따라 근사 모든 용어가 정의

. U 재 삽입 = 1/1의 X가 0

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

제공 X = 1, 단조롭게 증가 사이에서 X = 0, 1. x = p/q가 이성분이고 정수인 경우 결과 합리적인 표현은

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

0.2^0.5 = 0.447 그러나 위의 근사값을 따르는 경우 0.2^0.5 ~ 0.333이며 원래 결과와 거의 같지 않습니다. 근사치가 x의 값이 작은 경우에 별이 아닐 것이라고 생각했습니다. –

+0

> 1보다 좋습니다. <1에 대한 좋은 근사를 찾는 것은 x = 0에서의 무한 경사 때문에 어렵습니다. 일반적으로 근사 함수는 어디서나 유한 한 기울기를 갖습니다. – LutzL