在R语言.Call接口中如何检测Inf或-Inf值?
检测R包C代码中的正负无穷值
在通过.Call调用的R包编译代码里,除了用R_FINITE判断是否为特殊值,要直接检测double类型的正负无穷,可以用以下实用方法:
直接对比R提供的宏定义
R的C API已经预定义了R_PosInf(正无穷)和R_NegInf(负无穷)宏,你可以直接用等于号和这些宏做比较:
// 检测正无穷,比如CDF场景返回1 if (x == R_PosInf) { return ScalarReal(1.0); } // 检测负无穷,比如CDF场景返回0 if (x == R_NegInf) { return ScalarReal(0.0); }
关键注意事项
- 这些宏定义在
R_ext/Arith.h头文件中,确保代码已引入该头文件(R包的C代码通常会自动关联,若未引入可手动添加#include <R_ext/Arith.h>) - 浮点数的特殊值(无穷、NaN)遵循IEEE 754标准,直接和R提供的宏比较是安全的,不存在精度误差问题
以下是累积分布函数(CDF)场景的完整示例:
SEXP my_cdf(SEXP x) { SEXP result = PROTECT(allocVector(REALSXP, length(x))); double *x_ptr = REAL(x); double *res_ptr = REAL(result); int n = length(x); for (int i = 0; i < n; i++) { if (x_ptr[i] == R_NegInf) { res_ptr[i] = 0.0; } else if (x_ptr[i] == R_PosInf) { res_ptr[i] = 1.0; } else { // 此处替换为你的CDF核心计算逻辑 res_ptr[i] = compute_cdf(x_ptr[i]); } } UNPROTECT(1); return result; }
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

