为什么二项式上累积概率的计算值不同?
Why are the calculated values different for the binomial upper cumulative probability?
我正在尝试计算 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);
谢谢
看评论:frac1
和frac2
的计算有问题。在创建 BigDecimal
之前,您正在进行双除法。
尝试:
frac1 = new BigDecimal(21, mtCtx).divide(new BigDecimal(231, mtCtx), mtCtx);
frac2 = new BigDecimal(210, mtCtx).divide(new BigDecimal(231, mtCtx), mtCtx);
我正在尝试计算 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);
谢谢
看评论:frac1
和frac2
的计算有问题。在创建 BigDecimal
之前,您正在进行双除法。
尝试:
frac1 = new BigDecimal(21, mtCtx).divide(new BigDecimal(231, mtCtx), mtCtx);
frac2 = new BigDecimal(210, mtCtx).divide(new BigDecimal(231, mtCtx), mtCtx);