Я получаю фатальную ошибку с boost и Rcpp - PullRequest
0 голосов
/ 22 октября 2018

Как описано в посте:

Rcpp и boost: он должен работать, но не работает

Я пытаюсь использовать boost в Rcpp в Windows.(Упрощенный) файл:

// [[Rcpp::depends(BH)]]
#include <Rcpp.h>
#include <boost/multiprecision/float128.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>();
}

У меня была проблема с компиляцией.Как предложил @duckmayr в этом посте, я попытался:

Sys.setenv("PKG_LIBS" = "-lquadmath")

, а затем Rcpp::sourceCpp('quadexp.cpp')

Таким образом, компиляция выполняется без ошибок.Но затем, когда я выполняю qexp (), я получаю сообщение в RStudio о «фатальной ошибке», и RStudio полностью отключается.Вы знаете, что может происходить?Я предполагаю, что моя проблема связана с какой-то конфигурацией, которая у меня есть, поскольку @duckmayr может без проблем запускать тот же код.На какие части моей конфигурации следует обратить внимание, чтобы избежать этой неприятной «фатальной ошибки»?

1 Ответ

0 голосов
/ 22 октября 2018

В дополнение к приведенному выше комментарию:

edd@rob:~/git/so-r/52933795$ cat code.cpp
// [[Rcpp::depends(BH)]]
#include <Rcpp.h>
#include <boost/multiprecision/float128.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>();
}


/*** R
qexp()
*/
edd@rob:~/git/so-r/52933795$ Rscript -e 'Rcpp::sourceCpp("code.cpp")'

R> qexp()
[1] "0.731058578630004879251159241821836351"
edd@rob:~/git/so-r/52933795$

Т.е. , используя точно ваш код (плюс добавленный вызов R), он просто работает "как есть".

...