繁体   English   中英

(Rcpp)armadillos abs() function 与 c++ 一起使用时输出错误值,而 std::abs 工作

[英](Rcpp)armadillos abs() function outputs false values when used with c++ double while std::abs works

考虑这个 R function:

r_abs <- function(x,y,z){
    2 * abs((x >= y) - z)
}

还有那些 2 RcppArmadillo 等价物:

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::depends(RcppProgress)]]
#include <RcppArmadillo.h>
#include <string>
#include <progress.hpp>
using namespace arma;

// [[Rcpp::export]]
double arma_abs(const double &x, const double &y, const double &z)
{
    return 2 * abs((x >= y) - z);
}

// [[Rcpp::export]]
double std_abs(const double &x, const double &y, const double &z)
{
    return 2 * std::abs((x >= y) - z);
}

现在问题来了:

sourceCpp(".test/test.cpp")

x <- 1
y <- 2
z <- 0.5

r_abs(x,y,z)
[1] 1
arma_abs(x, y, z)
[1] 0
std_abs(x, y, z)
[1] 1

为什么 arma_abs() output 0 在这里? 该问题仅发生在-1 < z < 1

我非常感谢您能提供的任何帮助。

这是 C 和 C++ 的一个棘手且有些乏味的问题,最近添加的相关std::abs()部分修复

如果您使用的是 Unix 系统,请尝试man 3 abs 您对(不合格) abs()的使用等同于::abs()并且它从stdlib.h获取int abs(int)

并且强制转换为int使参数 -0.5 截断为零,乘以 2 仍然为零。 简而言之, arma与此无关。 (而且犰狳通常只有它的向量、矩阵、立方体、...类型的函数,而不是像double这样的原子 C/C++ 类型)。

为了完整起见,我的代码版本在下面嵌入了 R 部分。 我删除了未使用的引用 RcppProgress。

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

//using namespace arma;

// [[Rcpp::export]]
double arma_abs(const double &x, const double &y, const double &z) {
  auto val = (x >= y) - z;
  Rcpp::Rcout << "val " << val << std::endl;
  Rcpp::Rcout << "int(val) " << int(val) << std::endl;
  return 2 * ::abs((x >= y) - z);
}

// [[Rcpp::export]]
double std_abs(const double &x, const double &y, const double &z) {
    return 2 * std::abs((x >= y) - z);
}

/*** R

r_abs <- function(x,y,z){
    2 * abs((x >= y) - z)
}

x <- 1
y <- 2
z <- 0.5

r_abs(x,y,z)           # 1
arma_abs(x, y, z)      # 0
std_abs(x, y, z)       # 1
*/

编辑:错字更正。 上面我写std::fabs()的意思是std::abs() fabs()是我们一直必须使用的,以避免在这里看到的转换为int的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM