Rcpp: исключение с плавающей точкой с использованием типа double - PullRequest
0 голосов
/ 15 ноября 2018

Я попытался написать простую функцию в cpp, которую я могу использовать в rcpp, например:

#include <Rcpp.h> 
using namespace Rcpp;

// [[Rcpp::export]]
inline static double calc(double a, double b, double c){ 
    return a - b + c;
}

// [[Rcpp::export]]
void other_function() {
    double res = calc(1.00, 0.00, 3.00);        // no error

    NumericVector resV;
    resV[0] = calc(1.00, 0.00, 3.00);   // Floating point exception

    Rcout << res;                       // Floating point exception
}

Но каждый раз, когда я пытаюсь получить доступ к результату функции calc (), я получаю Исключение с плавающей запятой .

Если я только получу R-файл и вызову функцию res () из консоли, все будет в порядке:

source("myscript.R")
calc(1.00,0.00,3.00)
>> 4.00

Что я уже пробовал:

  • преобразовать double в NumericVector res и работать только с res [0]> не работает

  • поплавок> не работает

  • выполнить вычисления напрямую в другой функции> та же ошибка

UPDATE:

Каждый раз, когда я пытаюсь вызвать other_function () в другой функции, я получаю следующее сообщение:

Floating point exception

Например:

void another_function() {
    other_function();       // produce Floating point exception
}

Если я вызываю other_function () напрямую в R, все в порядке!

Также этот код (спасибо snake_style) не работал для меня:

NumericVector resV = NumericVector::create(progressionC(1.00, 0.00, 3.00));

решаемые

Я решил проблему , просто переустановив пакет Rcpp. Я не знаю, почему я получил эту ошибку ... в любом случае, теперь она работает.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Не ответ, но я хочу сохранить мои неудачные попытки воспроизвести эту проблему.Я использую R 3.5.1 в стабильной Debian с gcc 6.3.Я использовал следующий код:

#include <Rcpp.h> 
using namespace Rcpp;

// [[Rcpp::export]]
inline static double calc(double a, double b, double c){ 
  return a - b + c;
}

// [[Rcpp::export]]
void other_function() {
  double res = calc(1.00, 0.00, 3.00);        // no error

  NumericVector resV;
  resV[0] = calc(1.00, 0.00, 3.00);   // Floating point exception

  NumericVector resV1(1);
  resV1[0] = calc(1.00, 0.00, 3.00);   // Floating point exception

  NumericVector resV2 = NumericVector::create(calc(1.00, 0.00, 3.00));
  Rcout << res << "/" << resV << "/" << resV1 << "/" << resV2;                       // Floating point exception
}


// [[Rcpp::export]]
void another_function() {
  other_function();       // produce Floating point exception
}

/*** R
calc(1.00, 0.00, 3.00)
other_function()
another_function()
*/

Вызов Rcpp::sourceCpp() компилирует этот код и выдает следующий вывод:

> calc(1.00, 0.00, 3.00)
[1] 4

> other_function()
4//4/4
> another_function()
4//4/4
  • Нет ошибок времени выполнения.
  • В исходном коде результат из calc не присваивается (resV ничего не выводит).
  • Назначение работает, если либо указан размер вектора, либо если calc используется со статическимcreate метод, предложенный @ snake_style.
0 голосов
/ 15 ноября 2018

Попробуй так:

NumericVector resV = NumericVector::create(calc(1.00, 0.00, 3.00));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...