定期,有问题,即使在日常生活中,当位精度float64
/ int64
不足以获得与所要求的精度的答案。急忙寻找另一种乐器?也是一个选择。
或者,您不能这样做,但您会好奇地发现,为了以任意的精度进行计算,早就建立了GNU MPFR库,几乎所有语言都有包装器。实践表明,很少有人对此库熟悉,这可能是由于大学学习程序的特殊性以及随后的程序员主流所致。
图书馆是一个好图书馆,至少在扩大视野的范围内值得关注。在R上有一个Rmpfr包装器。下面,我将给出一个有关学童问题的简单示例(嗯,不要触碰NDA下的设计数据),我将触及几乎立即遭到攻击的许多经典耙。
它是以前出版物的延续。
例如,以Quantum 2019/2020学年竞赛中的第39个问题为例:
正数x和y使得在不等式中左下方的分数大于右上方的分数。x或y哪个更大?

自然,必须通过分析来解决(交替不平等),但这不是不将其用作演示的理由。
我们绘制一个简单的代码来计算分数序列。您可以立即设置最终值,然后设置的场景mpfr
,因此我们将逐步进行。
我们用标准方法解决library(tidyverse)
library(magrittr)
options(digits=15)
frec <- function(stopval, n, x){
res <- ifelse(n == stopval,
(stopval - 1) + stopval/(stopval + 1 + x),
(n - 1 ) + n / (frec(stopval, n + 2, x))
)
res
}
frec_wrap <- function(stopval, x){
res <- frec(stopval = stopval, n = 1, x = x)
print(glue::glue("{stopval}: {res}"))
res
}
sol_df <- tibble(stopval = seq(1, 29, by = 2)) %>%
mutate(val1 = purrr::map_dbl(stopval, frec_wrap, x = 1),
val2 = purrr::map_dbl(stopval, frec_wrap, x = 5),
delta = val1 - val2)
运气不好,在第14次迭代时(停止号= 29),准确性不足以区分小数。而且您必须考虑到2019年!

? , Rmfpr
. — float64
mpfr
.
library(tidyverse)
library(magrittr)
library(Rmpfr)
frec2 <- function(stopval, n, x){
if(n == stopval){
(stopval - 1) + stopval/(stopval + 1 + x)} else {
(n - 1 ) + n / (frec2(stopval, n + 2, x))
}
}
frec2_wrap <- function(stopval, x){
.precision <- 5000
res <- frec2(stopval = mpfr(stopval, .precision),
n = mpfr(1, .precision),
x = mpfr(x, .precision)
)
print(glue::glue("{stopval}: {formatMpfr(res, drop0trailing = TRUE)}"))
res
}
sol2_df <- tibble(stopval = seq(1, 29, by = 2)) %>%
mutate(val1 = purrr::map(stopval, frec2_wrap, x = 1),
val2 = purrr::map(stopval, frec2_wrap, x = 5))
. , tibble
. .

№1:
tibble
, vctrs
. ( mpfr
S4 ) list-column. - .
, vctrs
. , :
for(jj in 1:12){
flags_df[[glue("bp_2_{jj}_T")]] <- flags_df[[glue("bp_2_{jj}_in")]] & flags_df[[glue("flag_2_{jj}")]]
flags_df[[glue("bp_2_{jj}_F")]] <- flags_df[[glue("bp_2_{jj}_in")]] & ! flags_df[[glue("flag_2_{jj}")]]
}
№2:
list-column . mpfr
list-column.
№3
rpfm
. StackOverflow . . R?
? --! R, Python! !
. RTFM, .
- №1. —
tibble
. data.frame
. - №2.
rpfm
. , . data.frame
. - №3.
formatMpfr
.
.
library(tidyverse)
library(magrittr)
library(Rmpfr)
frec2 <- function(stopval, n, x){
if(n == stopval){
(stopval - 1) + stopval/(stopval + 1 + x)} else {
(n - 1 ) + n / (frec2(stopval, n + 2, x))
}
}
frec2_wrap <- function(stopval, x){
.precision <- 5000
res <- frec2(stopval = mpfr(stopval, .precision),
n = mpfr(1, .precision),
x = mpfr(x, .precision)
)
print(glue::glue("{stopval}: {formatMpfr(res, drop0trailing = TRUE)}"))
res
}
sol_df <- data.frame(stopval = seq(111, 119, by = 2)) %>%
mutate(val1 = new("mpfr", unlist(purrr::map(stopval, frec2_wrap, x = 1))),
val2 = new("mpfr", unlist(purrr::map(stopval, frec2_wrap, x = 5))),
delta = val1 - val2)
sol_txt_df <- sol_df %$%
tibble(stopval = stopval,
val1_txt = formatMpfr(val1, drop0trailing = TRUE),
val2_txt = formatMpfr(val2, drop0trailing = TRUE),
delta_txt = formatMpfr(delta, drop0trailing = TRUE))
P.S. . , . , , GNU MPFR.
— « R ?».