为什么二项式上累积概率的计算值不同?

时间:2015-06-17 07:24:01

标签: java bigdecimal

我试图计算java中二项分布的上累积概率。由于概率值可以超出双倍范围,我使用的是BigDecimal。试验总数的一个例子是n = 403,成功次数k = 370.每次试验的成功概率是(21/231)。当我计算累积概率并从1减去时,我得到1.1185E-14。然而,当我直接计算上累积概率(从k = 371到403)时,我得到5.2854E-341。我无法理解为什么,如果有人能够解释这种差异,我将不胜感激。



MathContext mtCtx = new MathContext(400, RoundingMode.HALF_UP);
BigDecimal frac1 = new BigDecimal(21.0/231.0, mtCtx);
BigDecimal frac2 = new BigDecimal(210.0/231.0, mtCtx);
Double cB = 0.0;
BigDecimal cBD = new BigDecimal(cB, mtCtx);
                
for (int num=0;num<=370;num++){
  BigDecimal pow1 = frac1.pow(num, mtCtx);
  BigDecimal pow2 = frac2.pow(403-num, mtCtx);
  
  BigInteger nminusk = bigFactorial(403-num);
  BigDecimal nminuskD = new BigDecimal(nminusk, mtCtx);
  BigInteger kFact = bigFactorial(num);
  BigDecimal kFactD = new BigDecimal(kFact, mtCtx);
  BigInteger nFact = bigFactorial(403);
  BigDecimal nFactD = new BigDecimal(nFact, mtCtx);

  BigDecimal binCoeff = (nFactD.divide((kFactD).multiply(nminuskD, mtCtx), mtCtx));
  
  
  BigDecimal prod1 = binCoeff.multiply(pow1);
  BigDecimal prod2 = prod1.multiply(pow2);
           
  cBD = cBD.add(prod2);
  
}
BigDecimal one = BigDecimal.ONE;
BigDecimal pVal = one.subtract(cBD);
System.out.println(pVal);
&#13;
&#13;
&#13;

谢谢

1 个答案:

答案 0 :(得分:0)

如评论中所示:.navsub lifrac1的计算存在问题。在创建frac2之前,您正在进行双重划分。

尝试:

BigDecimal