只需将 std::min(1,temp)
更改为 std::min(1.0,temp)
:
#include <cmath>
#include <Rcpp.h>
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
还有另外两个选项:
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;
}
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 是相当标准的来源 - 这通常会使编译器错误看起来不那么神秘。