如果你想计算分位数或 p 值,你可以使用 stats.distributions 在大多数情况下找到最合适的特殊函数,在这种情况下,我总是使用 stats.norm.isf 作为上尾 pvalue(也是因为我不想记住 erf 或 erfcinv 是什么)。
>>> for y in 10.**(-np.arange(5, 30, 2)):
print y, special.erfcinv(y) * np.sqrt(2), stats.norm.isf(y/2.), -special.ndtri(y/2)
1e-05 4.41717341347 4.41717341347 4.41717341347
1e-07 5.32672388628 5.32672388638 5.32672388638
1e-09 6.10941019166 6.10941020487 6.10941020487
1e-11 6.80650247883 6.80650249074 6.80650249074
1e-13 7.4410077655 7.44090215064 7.44090215064
1e-15 8.01401594878 8.02685888253 8.02685888253
1e-17 inf 8.57394407672 8.57394407672
1e-19 inf 9.08895010083 9.08895010083
1e-21 inf 9.57690145543 9.57690145543
1e-23 inf 10.0416376122 10.0416376122
1e-25 inf 10.4861701796 10.4861701796
1e-27 inf 10.9129127092 10.9129127092
1e-29 inf 11.3238345582 11.3238345582
zero323 指出的浮点问题在许多其他情况下仍然会出现。