49 *out_isnan = isnan(x) ? 1 : 0;
55 *out_isinf = isinf(x) ? 1 : 0;
61 *out_isfinite = isfinite(x) ? 1 : 0;
67 *out_signbit = signbit(x) ? 1 : 0;
74 if (!isfinite(epsilon) || epsilon < 0.0) {
77 if (isnan(a) || isnan(b)) {
81 if (isinf(a) || isinf(b)) {
113 lmmc_real_t diff, scale, threshold, zero, tmp1, tmp2;
115 if (out_equal == NULL) {
134 if (isnan(a) || isnan(b)) {
140 if (isinf(a) || isinf(b)) {
152 lmmc_max_inplace(&scale, &tmp1, &tmp2);
155 lmmc_max_inplace(&threshold, &abs_tol, &tmp1);
157 if (isnan(diff) || isnan(threshold)) {
163 if (isinf(threshold)) {
170 *out_equal = (
LMMC_REAL_CMP(&diff, &threshold) <= 0) ? 1 : 0;
#define LMMC_REAL_CLEAR(x)
释放一个 lmmc_real_t 变量(POD 类型为空操作)。
#define LMMC_REAL_INIT(x)
初始化一个 lmmc_real_t 变量(POD 类型为空操作)。
#define LMMC_REAL_DIV(res, a, b)
计算 *res = *a / *b 。
#define LMMC_REAL_SUB(res, a, b)
计算 *res = *a - *b 。
double lmmc_real_t
Public and internal LMMC real type.
#define LMMC_REAL_SET(dst, src)
将一个 lmmc_real_t 赋值到另一个:*dst = *src 。
#define LMMC_REAL_MUL(res, a, b)
计算 *res = *a * *b 。
#define LMMC_REAL_ABS(res, a)
计算绝对值,*res = |*a| 。
#define LMMC_REAL_CMP(a, b)
比较 *a 与 *b ,返回 -1/0/1 。
#define LMMC_REAL_SET_D(dst, dbl)
将一个 double 字面量赋值到 lmmc_real_t 。
#define LMMC_REAL_IS_FINITE(x)
判断 *x 是否为有限数。
lmmc_status_t lmmc_double_nearly_equal(lmmc_real_t a, lmmc_real_t b, int *out_equal)
使用默认容差的近似相等比较,等价于以 LMMC_DEFAULT_ABS_TOL / LMMC_DEFAULT_REL_TOL 调用 lmmc_double_nearly_equal_tol .
lmmc_status_t lmmc_isfinite(lmmc_real_t x, int *out_isfinite)
检测是否为有限数(非 NaN 且非 +/-infinity).
lmmc_status_t lmmc_isnan(lmmc_real_t x, int *out_isnan)
检测是否为 NaN ,结果写入 *out_isnan (0/1).
lmmc_status_t lmmc_signbit(lmmc_real_t x, int *out_signbit)
检测符号位(含 -0 ).
lmmc_status_t lmmc_inf(lmmc_real_t *out_inf)
写入 IEEE-754 正无穷.
lmmc_status_t lmmc_eps(lmmc_real_t *out_eps)
写入机器精度(1 与下一个可表示数的差).
#define LMMC_DEFAULT_REL_TOL
库默认的相对容差.
lmmc_status_t lmmc_isinf(lmmc_real_t x, int *out_isinf)
检测是否为 +/-infinity .
lmmc_status_t lmmc_approx_eq(lmmc_real_t a, lmmc_real_t b, lmmc_real_t epsilon, int *out_equal)
按绝对容差比较: 。
#define LMMC_DEFAULT_ABS_TOL
库默认的绝对容差.
lmmc_status_t lmmc_nan(lmmc_real_t *out_nan)
写入 IEEE-754 NaN.
lmmc_status_t lmmc_double_nearly_equal_tol(lmmc_real_t a, lmmc_real_t b, lmmc_real_t abs_tol, lmmc_real_t rel_tol, int *out_equal)
同时考虑绝对与相对容差的近似相等判定.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_INVALID_ARGUMENT