在c中编码离散分布时的精度问题

时间:2017-07-12 16:53:07

标签: c algorithm probability probability-distribution

我对C比较陌生,所以当谈到精度问题时,我总是有点担心。我正在处理一个相当大的代码,并且在特定点我需要根据离散概率分布选择一个值。基本上我需要做的是选择一个值k = 1,2,... N,其概率由公式

给出

P(k)= [e a * F(k)] / [Σ i = 1,...,N e aF(i )],

其中F只是一些使用k作为输入而a是实数的函数。 [抱歉公式看起来粗糙我不知道如何格式化。]到目前为止,我的代码看起来(粗略地)是这样的。我不得不做出一些改变,以便在上下文中提供可读性。

int k;
int N=10;
double a=5.5; //In the code it is just a positive real number
double xtemp=0;
double X[10];
double fk;

for(k=0;k<N;k++){
  fk = F(k); // Here F returns a double
  xtemp += exp(a*fk);
  X[k]=xtemp;
}
xtemp = xtemp*U01(); //U01 returns a uniformly random number on [0,1]
for(k=0;k<K;k++){
   if(xtemp<=X[k]){
     return k;
   }
}

这应该从数学的角度给出期望的结果,但是编码比我更好的人说xtemp可能会成为问题而变得不精确。我想知道你怎么能为此做错误处理?我也愿意接受更好的方法来实现这个想法。我感谢任何帮助和建议。

1 个答案:

答案 0 :(得分:0)

鉴于您当前的代码可能导致评估超出double的可表示值的有限范围的子表达式,我建议重写表达式。考虑这样的事情:

P(k)= [e a * F(k)] / [Σ i = 1,...,N e a * F (ⅰ)

P -1 (k)= [Σ i = 1,...,N e a * F(i)] / [e a * F(k)]

P -1 (k)=Σ i = 1,...,N [e a * F(i) / e a * F(k)]

P -1 (k)=Σ i = 1,...,N [e a * F(i) - a * F( k)的

P -1 (k)=Σ i = 1,...,N [e a *(F(i) - F(k ))

P(k)= [Σ i = 1,...,N [e a *(F(i) - F(k))]] -1

如果你能提供一个最小,完整和可测试的例子,你可能会得到更好的建议。