對離散隨機變量 X={1..m},概率 p(x)>0。定義累積分布函數 F(x)=Σ_{i≤x} p(i),修正累積分布函數 F̄(x)=F(x-1)+p(x)/2(即階梯中點)。編碼為 F̄(x) 的二進制小數展開,取前 l(x)=⌈log₂(1/p(x))⌉+1 位。
#define MAX_SYM 100
#define MAX_CODE_LEN 200 // 須足夠大防越界
typedef struct {
double px, Fx, Fbax;
int lx;
int code[MAX_CODE_LEN];
} SFE;
SFE sym[MAX_SYM];
void calc_Fx() { // 累積分布
double sum = 0;
for (int i=1; i<=m; ++i) {
sum += sym[i].px;
sym[i].Fx = sum;
}
}
void calc_Fbax() { // 修正累積
sym[1].Fbax = sym[1].px / 2.0;
for (int i=2; i<=m; ++i) {
double sum = 0;
for (int j=1; j 1e-12) {
val *= 2;
*code = (int)val;
decimal_to_binary(val - (int)val, code+1);
}
}
code 數組必須足夠大,或直接只生成前 l(x) 位。