2017-02-16 100 views
-1

什麼是最好的方式來數值計算像Rcpp以下的東西?Rcpp與四精度計算

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

在許多情況下,計算可能需要多精度(對於EXP),但最終的結果可以是圓形的,以通常的兩倍。

Via quadmath?通過提升?

如果R中留(外RCPP的),真的有舒適的包裝紙做的工作:

library(Rmpfr) 

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

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

但如何與RCPP訪問?

+0

爲什麼不計算在*不*要求的方式同樣的事情這樣的極端指數範圍? – user2357112

+0

例如,在這裏,您可以將1500添加到'exp'的所有參數。 – user2357112

+2

這只是一個很小的例子......我想申請的情況下,我不知道數字是什麼。 – Inferrator

回答

6

快速啓動和運行的方法是安裝BH軟件包並使用Boost Multiprecision庫,該庫提供several extended precision floating point types。例如,該代碼DEMOS的float128mpf_float_100類型:

// [[Rcpp::depends(BH)]] 
#include <Rcpp.h> 
#include <boost/multiprecision/float128.hpp> 
#include <boost/multiprecision/mpfr.hpp> 

namespace mp = boost::multiprecision; 

// [[Rcpp::export]] 
std::string qexp(double da = -1500.0, double db = -1501.0) 
{ 
    mp::float128 a(da), b(db); 
    mp::float128 res = mp::exp(a)/(mp::exp(a) + mp::exp(b)); 
    return res.convert_to<std::string>(); 
} 

// [[Rcpp::export]] 
std::string mpfr_exp(double da = -1500.0, double db = -1501.0) 
{ 
    mp::mpf_float_100 a(da), b(db); 
    mp::mpf_float_100 res = mp::exp(a)/(mp::exp(a) + mp::exp(b)); 
    return res.convert_to<std::string>(); 
} 

後者需要添加標誌用於編譯之前鏈接到libmpfrlibgmp;前者沒有,因爲它是圍繞GCC的包裝內置__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 
2

我擔心你可能會大部分困惑。

Rcpp是R和C++之間的橋樑。它既不是新語言,也不是新系統。

而在C++中,你使用類似GNU gmplib又名的GNU多精度運算庫其中,當然,已經包裹了R作爲包gmp

但是,如果你想編寫C++函數,從所謂的R,連接GMP庫 - 當然。它回到'我如何編寫一個可從R訪問外部庫的C++函數 - 這個問題在這裏也被多次討論過。

+1

我不覺得困惑,我只是尋找一個最小的例子。我只是看看gmp資源,謝謝。 – Inferrator

+0

就像其他需要外部庫的東西一樣:完全可行,但您需要確保所有相關操作系統上都存在該庫。 –