Заставьте exp() обрабатывать большие отрицательные значения, Rcpp

#c #r #rcpp

Вопрос:

Я пишу код Rcpp и сталкиваюсь со следующей проблемой

 #include <RcppArmadillo.h>
    
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
double EXP(double x){
  return exp(x);
}
 

Я хотел бы спросить, есть ли способ заставить функцию EXP обрабатывать большие отрицательные значения. Например, когда я бегу

 EXP(-5000)
[1] 0
 

В идеале я хотел бы иметь что-то ненулевое, но очень близкое к нулю. Есть ли способ достичь этого?

Комментарии:

1. EXP(-5000) находится 3.369870547951800096615642407437e-2172 за пределами диапазона double (e-308), но не long double (если поддерживаются 80 или 128 — битные удвоения) см. Диапазон значений en.cppreference.com/w/cpp/language/types

2. Также «…Для совместимого с IEEE типа double переполнение гарантируется, если 709,8 < arg, и нижний поток гарантируется, если arg < -708,4 …» см. en.cppreference.com/w/cpp/numeric/math/exp так что просто проверьте 0 и верните небольшое количество.

3. @RichardCritten Проблема, конечно, в том, что у R нет длинных двойников.

4. Общий подход к этой проблеме состоит в том, чтобы попытаться избежать возведения в степень и работать в логарифмической шкале.