double binomtail(int n, int t, double p, char c) 
{
/** 
 c = '+':   P(S>=t) 
 c = '-':   P(S<t) 
 WARNING <= t use binomtail(n, t+1, ... 
*/
    double *bindis ;
    double val ;

    ZALLOC(bindis, n+1, double) ;
    genlogbin(bindis, n, p) ;
    vexp(bindis, bindis, n+1) ;
    if (c=='+') 
     val = asum(bindis+t, n-t+1) ; 
    else  
     val = asum(bindis, t) ;
    free(bindis) ;
    return val ;
}
double binlogtail(int n, int t, double p, char c) 
{

    double *bindis ;
    double val, base ;

    ZALLOC(bindis, n+1, double) ;
    genlogbin(bindis, n, p) ;
    base = bindis[t] ;
    vsp(bindis, bindis, -base, n+1) ;
    if (c=='+') {
     vexp(bindis+t, bindis+t, n-t+1) ;
     val = asum(bindis+t, n-t+1) ; 
    }
    else  {
     vexp(bindis, bindis, t) ;
     val = asum(bindis, t) ;
    }
    free(bindis) ;
    return (log(val) + base) ;

}
Пример #3
0
int main() 
{
  double p, val ;
  int n, t, c, i ;
  char str[MAXS] ;
  char line[MAXS] ;
  char *spt[MAXFIELD] ;
  int nsplit ;
  double *a ;

  while (fgets(line,MAXS,stdin) != NULL)   {
   nsplit = splitup(line, spt, MAXFIELD) ;
   n = atoi(spt[0]) ;
   p = atof(spt[1]) ;
   freeup(spt, nsplit) ;
   if ((p<=0.0) || (p>=1.0)) fatalx("bad line %s\n",line) ;
   ZALLOC(a, n+1, double) ;
   genlogbin(a, n, p) ;
   vexp(a, a, n+1) ;
   for (i=0; i<=n; i++) {  
    printf("%3d %15.9f\n",i, a[i]) ;
   }
  }
}