LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
numeric_scalar.c
浏览该文件的文档.
1#include <math.h>
3
5 if (out_res == NULL) { return LMMC_STATUS_INVALID_ARGUMENT; }
6 LMMC_REAL_SET_D(out_res, atan2(y, x));
7 return LMMC_STATUS_OK;
8}
9
11 double sine, cosine;
12 if (out_sin == NULL || out_cos == NULL || out_sin == out_cos || !isfinite(x)) {
14 }
15 sine = sin(x);
16 cosine = cos(x);
17 if (!isfinite(sine) || !isfinite(cosine)) {
19 }
20 LMMC_REAL_SET_D(out_sin, sine);
21 LMMC_REAL_SET_D(out_cos, cosine);
22 return LMMC_STATUS_OK;
23}
24
26 double result;
27 if (out_res == NULL || !isfinite(x) || !isfinite(y)) {
29 }
30 result = hypot(x, y);
31 if (!isfinite(result)) {
33 }
34 LMMC_REAL_SET_D(out_res, result);
35 return LMMC_STATUS_OK;
36}
37
39 double result;
40 if (out_res == NULL || !isfinite(x)) {
42 }
43 result = exp2(x);
44 if (!isfinite(result)) {
46 }
47 LMMC_REAL_SET_D(out_res, result);
48 return LMMC_STATUS_OK;
49}
50
52 double result;
53 if (out_res == NULL || !isfinite(x)) {
55 }
56 if (x <= 0.0) {
58 }
59 result = log2(x);
60 if (!isfinite(result)) {
62 }
63 LMMC_REAL_SET_D(out_res, result);
64 return LMMC_STATUS_OK;
65}
66
68 double result;
69 if (out_res == NULL || !isfinite(x)) {
71 }
72 result = expm1(x);
73 if (!isfinite(result)) {
75 }
76 LMMC_REAL_SET_D(out_res, result);
77 return LMMC_STATUS_OK;
78}
79
81 double result;
82 if (out_res == NULL || !isfinite(x)) {
84 }
85 if (x <= -1.0) {
87 }
88 result = log1p(x);
89 if (!isfinite(result)) {
91 }
92 LMMC_REAL_SET_D(out_res, result);
93 return LMMC_STATUS_OK;
94}
95
97 if (out_iptr == NULL || out_frac == NULL || out_iptr == out_frac) {
99 }
100 {
101 double ip;
102 double fr = modf(x, &ip);
103 LMMC_REAL_SET_D(out_iptr, ip);
104 LMMC_REAL_SET_D(out_frac, fr);
105 }
106 return LMMC_STATUS_OK;
107}
108
110 double result;
111 if (out_res == NULL || isnan(x) || isnan(y)) {
113 }
114 if (isinf(x) || y == 0.0) { return LMMC_STATUS_OUT_OF_RANGE; }
115 result = fmod(x, y);
116 if (!isfinite(result)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
117 LMMC_REAL_SET_D(out_res, result);
118 return LMMC_STATUS_OK;
119}
120
122 double result;
123 if (out_res == NULL || !isfinite(x)) {
125 }
126 result = ldexp(x, exp);
127 if (!isfinite(result) || (x != 0.0 && result == 0.0)) {
129 }
130 LMMC_REAL_SET_D(out_res, result);
131 return LMMC_STATUS_OK;
132}
133
135 if (out_res == NULL) { return LMMC_STATUS_INVALID_ARGUMENT; }
136 LMMC_REAL_SET_D(out_res, nextafter(x, y));
137 return LMMC_STATUS_OK;
138}
139static lmmc_status_t store_finite_scalar_result(
140 lmmc_real_t value, lmmc_real_t* out) {
141 if (!isfinite(value)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
142 *out = value;
143 return LMMC_STATUS_OK;
144}
145
147 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
148 if (x < -1.0 || x > 1.0) { return LMMC_STATUS_OUT_OF_RANGE; }
149 return store_finite_scalar_result(asin(x), out);
150}
151
153 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
154 if (x < -1.0 || x > 1.0) { return LMMC_STATUS_OUT_OF_RANGE; }
155 return store_finite_scalar_result(acos(x), out);
156}
157
159 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
160 return store_finite_scalar_result(atan(x), out);
161}
162
164 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
165 return store_finite_scalar_result(sinh(x), out);
166}
167
169 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
170 return store_finite_scalar_result(cosh(x), out);
171}
172
174 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
175 return store_finite_scalar_result(tanh(x), out);
176}
177
179 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
180 return store_finite_scalar_result(asinh(x), out);
181}
182
184 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
185 if (x < 1.0) { return LMMC_STATUS_OUT_OF_RANGE; }
186 return store_finite_scalar_result(acosh(x), out);
187}
188
190 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
191 if (x <= -1.0 || x >= 1.0) { return LMMC_STATUS_OUT_OF_RANGE; }
192 return store_finite_scalar_result(atanh(x), out);
193}
194
196 if (!out || !isfinite(x) || !isfinite(y)) { return LMMC_STATUS_INVALID_ARGUMENT; }
197 if ((x == 0.0 && y < 0.0) ||
198 (x < 0.0 && trunc(y) != y)) {
200 }
201 return store_finite_scalar_result(pow(x, y), out);
202}
203
205 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
206 return store_finite_scalar_result(ceil(x), out);
207}
208
210 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
211 return store_finite_scalar_result(floor(x), out);
212}
213
215 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
216 return store_finite_scalar_result(round(x), out);
217}
218
220 if (!out || !isfinite(x)) { return LMMC_STATUS_INVALID_ARGUMENT; }
221 return store_finite_scalar_result(trunc(x), out);
222}
double lmmc_real_t
Public and internal LMMC real type.
#define LMMC_REAL_SET_D(dst, dbl)
将一个 double 字面量赋值到 lmmc_real_t 。
lmmc_status_t lmmc_expm1(lmmc_real_t x, lmmc_real_t *out_res)
计算 ,对小 x 更精确.
lmmc_status_t lmmc_asin(lmmc_real_t x, lmmc_real_t *out)
实标量函数的公共状态约定。
lmmc_status_t lmmc_cosh(lmmc_real_t x, lmmc_real_t *out)
计算双曲余弦 .
lmmc_status_t lmmc_log1p(lmmc_real_t x, lmmc_real_t *out_res)
计算 ,对小 x 更精确.
lmmc_status_t lmmc_atan2(lmmc_real_t y, lmmc_real_t x, lmmc_real_t *out_res)
计算 .
lmmc_status_t lmmc_sinh(lmmc_real_t x, lmmc_real_t *out)
计算双曲正弦 .
lmmc_status_t lmmc_fmod(lmmc_real_t x, lmmc_real_t y, lmmc_real_t *out_res)
计算浮点余数,结果符号与 x 相同,幅值小于 y 的幅值.
lmmc_status_t lmmc_ceil(lmmc_real_t x, lmmc_real_t *out)
计算向上取整 .
lmmc_status_t lmmc_hypot(lmmc_real_t x, lmmc_real_t y, lmmc_real_t *out_res)
缩放计算欧氏距离 。
lmmc_status_t lmmc_floor(lmmc_real_t x, lmmc_real_t *out)
计算向下取整 .
lmmc_status_t lmmc_asinh(lmmc_real_t x, lmmc_real_t *out)
计算反双曲正弦 .
lmmc_status_t lmmc_tanh(lmmc_real_t x, lmmc_real_t *out)
计算双曲正切 .
lmmc_status_t lmmc_sincos(lmmc_real_t x, lmmc_real_t *out_sin, lmmc_real_t *out_cos)
计算同一有限弧度值的正弦和余弦.
lmmc_status_t lmmc_nextafter(lmmc_real_t x, lmmc_real_t y, lmmc_real_t *out_res)
计算 x 朝 y 方向的下一个可表示浮点数.
lmmc_status_t lmmc_ldexp(lmmc_real_t x, int exp, lmmc_real_t *out_res)
计算 .
lmmc_status_t lmmc_round(lmmc_real_t x, lmmc_real_t *out)
计算四舍五入 .
lmmc_status_t lmmc_acos(lmmc_real_t x, lmmc_real_t *out)
计算反余弦 .
lmmc_status_t lmmc_exp2(lmmc_real_t x, lmmc_real_t *out_res)
计算 .
lmmc_status_t lmmc_log2(lmmc_real_t x, lmmc_real_t *out_res)
计算 .
lmmc_status_t lmmc_pow(lmmc_real_t x, lmmc_real_t y, lmmc_real_t *out)
计算幂 .
lmmc_status_t lmmc_split_int_frac(lmmc_real_t x, lmmc_real_t *out_iptr, lmmc_real_t *out_frac)
拆分整数部分与小数部分: .
lmmc_status_t lmmc_atanh(lmmc_real_t x, lmmc_real_t *out)
计算反双曲正切 ,要求 .
lmmc_status_t lmmc_atan(lmmc_real_t x, lmmc_real_t *out)
计算反正切 .
lmmc_status_t lmmc_acosh(lmmc_real_t x, lmmc_real_t *out)
计算反双曲余弦 ,要求 .
lmmc_status_t lmmc_trunc(lmmc_real_t x, lmmc_real_t *out)
计算截断取整 (向零方向取整).
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_OUT_OF_RANGE