我对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可能会成为问题而变得不精确。我想知道你怎么能为此做错误处理?我也愿意接受更好的方法来实现这个想法。我感谢任何帮助和建议。
答案 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
如果你能提供一个最小,完整和可测试的例子,你可能会得到更好的建议。