0

我对 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 可能会出现问题并且变得不精确。我想知道您如何为此进行错误处理?我也愿意以更好的方式来实现这个想法。我感谢任何帮助和建议。

4

1 回答 1

0

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

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

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

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

于 2017-07-12T17:48:05.560 回答