2017-02-16 32 views
-1

Rcpp内で以下のような数値計算を行う最良の方法は何ですか?4倍精度計算によるRcpp

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

多くの場合、計算は(EXP用)マルチ精度を必要とするかもしれないが、最終的な結果は、通常の二重に丸められることができます。

Via quadmath?ブースト経由ですか?

library(Rmpfr) 

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

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

しかし、どのようにrcppにアクセスする方法:あなたがR(Rcppの外)に滞在する場合

、仕事をするために、本当に快適なラッパーがあるのですか?

+0

理由だけ* *必要としない方法で同じことを計算していない:それは__float128に建てられたGCCのラッパーであるとして前者は、しませんそのような極端な指数範囲? – user2357112

+0

たとえば、ここではexpにすべての引数を1500だけ追加することができます。 – user2357112

+2

これはほんの少しの例です...数字が何であるかわからない状況で応募したいと思います。 – Inferrator

答えて

6

すぐに起動して実行するには、BHパッケージをインストールし、several extended precision floating point typesを提供するBoost Multiprecisionライブラリを使用します。例えば、このコードは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にリンクするためのフラグを追加する必要が。 Rmpfrに比較

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

qexp() 
# [1] "0.731058578630004879251159241821836351" 

mpfr_exp() 
# [1] "0.731058578630004879251159241821836274365144640165056519276365907919040453070204639387474532075981245292174466493140773" 

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++では、あなたはもちろん、すでにパッケージgmp

としてRのために包まれた。しかし、あなたがから呼び出されるC++関数を、書きたい場合はされてきた、GNU gmplib別名GNU多重精度演算ライブラリのようなものを使用R、GMPライブラリとのインターフェース - 確かに。 「外部ライブラリにアクセスするRから呼び出すことのできるC++関数をどのように書くか」ということに戻ります。その質問はここでも何度もカバーされています。

+1

私は混乱しているとは思わない、私はちょうど最小限の例を探していた。私はちょうどgmpのソースを見てみましょう、ありがとう。 – Inferrator

+0

これは外部ライブラリを必要とするものと全く同じです:完全に実行可能ですが、ライブラリが関連するすべてのOSに存在することを保証する必要があります。 –