只需将std::min(1,temp) 更改为std::min(1.0,temp):
#include <cmath>
#include <Rcpp.h>
// [[Rcpp::export]]
double f4RandomC(double x, double a, double b) {
double out, temp;
temp =(log( (a*(1-x)) / (a+x) )) /log(b) ;
out = std::min(1.0,temp );
return out;
}
我假设这与std::min 的模板定义有关
template <class T> const T& min (const T& a, const T& b);
它仅根据一种类型 (T) 定义,而您传递给它的是两种数据类型(int 和 double)。
或者由于您只比较两个值,您可以通过将std::min 替换为三元运算符 (?:) 来更简洁地执行此操作:
double f4RandomC(double x, double a, double b) {
double temp;
temp =(log( (a*(1-x)) / (a+x) )) /log(b) ;
return temp < 1 ? temp : 1;
}
我猜operator< 的类型推导比std::min 更灵活。
std::min 的另外两个选项:
// [[Rcpp::export]]
double f4RandomC2(double x, double a, double b) {
double out, temp;
int z = 1;
temp =(log( (a*(1-x)) / (a+x) )) /log(b) ;
out = std::min( static_cast<double>(z),temp );
return out;
}
// [[Rcpp::export]]
double f4RandomC3(double x, double a, double b) {
double out, temp;
int z = 1;
temp =(log( (a*(1-x)) / (a+x) )) /log(b) ;
out = std::min<double>( z,temp );
return out;
}
尽管在这种情况下,将1 更改为1.0 肯定比(不必要地)定义int z 只是为了稍后将其转换为双精度。
通过阅读函数/类定义(与大多数编程语言一样),您可以学到很多东西 - cplusplus.com 和 cppreference.com 是相当标准的来源 - 它通常会使编译器错误看起来不那么神秘。