具有四精度计算的Rcpp

具有四精度计算的Rcpp,r,rcpp,R,Rcpp,在Rcpp中,以数字方式计算以下内容的最佳方法是什么 exp(-1500)/(exp(-1500)+exp(-1501)) 在许多情况下,计算可能需要多精度(对于exp),但最终结果可以四舍五入到通常的双精度 通过quadmath?通过boost 如果您呆在R(Rcpp之外),有非常舒适的包装器来完成这项工作: library(Rmpfr) a = mpfr(-1500,100) b = mpfr(-1501,100) exp(a)/(exp(a)+exp(b)) 但是如何使用rcpp访问

在Rcpp中,以数字方式计算以下内容的最佳方法是什么

exp(-1500)/(exp(-1500)+exp(-1501))

在许多情况下,计算可能需要多精度(对于exp),但最终结果可以四舍五入到通常的双精度

通过quadmath?通过boost

如果您呆在R(Rcpp之外),有非常舒适的包装器来完成这项工作:

library(Rmpfr)

a = mpfr(-1500,100)
b = mpfr(-1501,100)

exp(a)/(exp(a)+exp(b))

但是如何使用rcpp访问呢?

我担心您可能会感到困惑

RCPP是R与C++之间的桥梁。它既不是一种新的语言,也不是一种新的系统

<>和在C++中,你使用的是类似于AKA的GNU多精度算术库,当然,它已经被包装成R作为包


但是如果你想写C++函数,从R调用,连接GMP库——你当然可以。这是“如何编写一个从R访问外部库的C++函数”——这个问题也在这里被多次覆盖。

一个快速的启动和运行方法是安装<代码> BH 包,并使用Boost多精度库,它提供了。例如,此代码演示和类型:

/[[Rcpp::depends(BH)]]
#包括
#包括
#包括
名称空间mp=boost::multiprecision;
//[[Rcpp::导出]]
字符串qexp(双da=-1500.0,双db=-1501.0)
{
mp::128 a(da),b(db);
float128 res=mp::exp(a)/(mp::exp(a)+mp::exp(b));
返回res.convert_to();
}
//[[Rcpp::导出]]
std::string mpfr_exp(双da=-1500.0,双db=-1501.0)
{
mp::强积金浮点数100 a(da),b(db);
mp::mpf_float_100 res=mp::exp(a)/(mp::exp(a)+mp::exp(b));
返回res.convert_to();
}

后者要求在编译之前添加链接到
libmpfr
libgmp
的标志;前者不是,因为它是GCC内置的
\uuuu float128
的包装:

Sys.setenv("PKG_LIBS" = "-lmpfr -lgmp")
Rcpp::sourceCpp('/tmp/quadexp.cpp')

qexp()
# [1] "0.731058578630004879251159241821836351"

mpfr_exp()
# [1] "0.731058578630004879251159241821836274365144640165056519276365907919040453070204639387474532075981245292174466493140773"
Rmpfr
相比

library(Rmpfr)

a <- mpfr(-1500, 100)
b <- mpfr(-1501, 100)

exp(a) / (exp(a) + exp(b))
# 1 'mpfr' number of precision  100   bits 
# [1] 7.3105857863000487925115924182206e-1
库(Rmpfr)

a为什么不以一种不需要如此极端指数范围的方式计算同一事物呢?例如,在这里,您可以向
exp
的所有参数中添加1500个参数。这只是一个最小的示例。。。我想在我不知道数字的情况下申请。然后计算调整!取最大参数(-1500)并从所有参数中减去它。我也可以进行级数展开,但这不是问题所在。我不觉得困惑,我只是在寻找一个最小的例子。那我就看一下gmp的来源,谢谢。这就像其他任何需要外部库的东西一样:完全可行,但你需要确保所有相关的操作系统上都有这个库。作为记录,公认的答案正是我所说的:需要外部库。它也很好地展示了一个。