如何让R使用pnorm输出非常小的数字?

4smxwvx5  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(106)
> pnorm(-37)
[1] 5.725571e-300

> pnorm(-37.5)
[1] 4.605353e-308

现在当我再减少一点的时候,我得到了

> pnorm(-37.6)
[1] 0

有没有可能让R显示一个更小的数字?理想情况下,最好能得到pnorm(-39)甚至pnorm(-125)的数值。

11dmarpk

11dmarpk1#

正如注解所指出的,您可以使用log.p=参数将其转换为对数标度。然而,这给了你一个以e为基数的输出,如果你想让它像上面的例子一样以10为基数,你可以得到你想要的输出,像这样:

x <- pnorm(-39, log.p = T)
x * log10(exp(1))
# -332.2714

x <- pnorm(-125, log.p = T)
x * log10(exp(1))
# -3395.422

你可以把它解释为问题中例子的力量。

示例

一些例子显示了这一点:

x <- pnorm(-35, log.p = T)
x * log10(exp(1))
# -267.9489

pnorm(-35)
# 1.124911e-268

x <- pnorm(-19, log.p = T)
x * log10(exp(1))
# -80.06919

pnorm(-19)
# 8.527224e-81

准确答案

下面是一个显示实际数字的示例:

x <- pnorm(-37.5, log.p = T)
x * log10(exp(1))
# -307.3367

pnorm(-37.5)
# 4.605353e-308
10^-307.3367
# 4.605746e-308

由于四舍五入,这只是稍微偏离(从代码中插入实际数字以获得确切的答案)。
当然,对于更大的数字,你必须保持它的指数形式,因为R仍然会给予你0。
电话:+86-10 -332.2714
如果你想知道如果R不把很小的数字四舍五入到0,它会给予你什么,你可以把指数分开。例如,10^-2 = 10^(-1-1),或者在我们的例子中,10^-2.2 = 10^-(2 + 0.2)。因此,按照以下步骤,我们可以用pnorm()再次检查答案:

x <- pnorm(-35, log.p = T)
x * log10(exp(1))
# -267.9489
pnorm(-35)
# 1.124911e-268

10^-(267 + .9489)
#1.124864e-268

10^-0.9489 * 10^-267
#1.124864e-268

0.1124864 * 10^-267
#1.124864e-268

0.1124864e-267
#1.124864e-268

所以我们来看看一个R给出0的例子:

x <- pnorm(-125, log.p = T)
x * log10(exp(1))

10^-.422 * 10^-3395
0.3784426e-3395

因此,如果R没有停止并舍入到0,则答案R将给予:0.3784426e-3395

为什么会这样

这样做是因为得到的输出是x = exp(pnorm(q, log.p = T))。因此,要将其转换为基数10,您可以使用log规则:

log10(exp(x)) = x * log10(exp(1))

相关问题