用c语言对离散分布进行编码时的精度问题

用c语言对离散分布进行编码时的精度问题,c,algorithm,probability,probability-distribution,C,Algorithm,Probability,Probability Distribution,我对C语言比较陌生,所以当涉及到精度问题时,我总是有点担心。我正在使用一个更大的代码,在一个特定的点上,我需要根据离散概率分布选择一个值。基本上我需要做的是选择一个值k=1,2,…N,概率由公式给出 p(k)=[ea*F(k)]/[i=1,…,NeaF(i)] 式中,F只是使用k作为输入的函数,a是实数。[抱歉,公式看起来很粗糙,我不确定如何格式化。]到目前为止,我的代码看起来(大致)像这样。我不得不做一些修改,以帮助脱离上下文的可读性 int k; int N=10; double a=5.5

我对C语言比较陌生,所以当涉及到精度问题时,我总是有点担心。我正在使用一个更大的代码,在一个特定的点上,我需要根据离散概率分布选择一个值。基本上我需要做的是选择一个值k=1,2,…N,概率由公式给出

p(k)=[ea*F(k)]/[i=1,…,NeaF(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;
   }
}
intk;
int N=10;
双a=5.5//在代码中,它只是一个正实数
双xtemp=0;
双X[10];
双fk;

对于(k=0;k<p>),假定您当前的代码可能会导致子表达式的表达式超出子表示的有限范围内的代码值>双< /代码>,我建议改写表达式。 p(k)=[ea*F(k)]/[i=1,…,Nea*F(i)]

p-1(k)=[∑i=1,…,Nea*F(i)] /[ea*F(k)]

p-1(k)=∑i=1,…,N[ea*F(i) /ea*F(k)]

p-1(k)=∑i=1,…,N[ea*F(i)-a*F(k)]

p-1(k)=∑i=1,…,N[ea*(F(i)-F(k))]

p(k)=[∑i=1,…,N[ea*(F(i)-F(k))]-1


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

个人
exp(a*F(k))是什么
值,如?它们非常大吗?非常小吗?它们是非常大和非常小的混合体吗?最后一个值很可能会导致精度问题……这可能会帮助您:@这些值变化很大,最终可能会非常大。我通常会这么说1@Scot您是否尝试过查看
exp(720)
甚至不同于C实现中的
无限
exp(720)
对于
双精度
来说太大了,但显然
长双精度
应该能够处理它。