p値に関するジャックの実用的なアドバイスに加えて、関数は明確に定義されているので(実用的でない場合)、これが機能しない有限精度の数学的理由を示します。
.Machine$double.eps
は2.220446e-16
であり、それは1に追加して何か違うものを得ることができる最小の数です。つまり、1とは異なり、それが得られる最小の値です。
> pf(80:90,1,200)
[1] 1 1 1 1 1 1 1 1 1 1 1
> sprintf("%.17f",pf(80:90,1,200))
[1] "0.99999999999999978" "0.99999999999999978" "0.99999999999999989"
[4] "0.99999999999999989" "1.00000000000000000" "1.00000000000000000"
[7] "1.00000000000000000" "1.00000000000000000" "1.00000000000000000"
[10] "1.00000000000000000" "1.00000000000000000"
> sprintf("%a", pf(80:90,1,200))
[1] "0x1.ffffffffffffep-1" "0x1.ffffffffffffep-1" "0x1.fffffffffffffp-1"
[4] "0x1.fffffffffffffp-1" "0x1p+0" "0x1p+0"
[7] "0x1p+0" "0x1p+0" "0x1p+0"
[10] "0x1p+0" "0x1p+0"
ただし、近似値$ 1-p =-\ ln(p)$と、p値の対数をより正確に取得できるという事実を使用できます。
> -pf(80:90,1,200,log.p=TRUE)
[1] 2.540347e-16 1.770938e-16 1.236211e-16 8.640846e-17 6.047690e-17
[6] 4.238264e-17 2.974043e-17 2.089598e-17 1.470045e-17 1.035491e-17
[11] 7.303070e-18