LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
stdlib_scalar_functions.c
浏览该文件的文档.
1#include "lmmc/stdlib.h"
2
3#include <math.h>
4
5#include "stdlib_internal.h"
6
8{
9 static const char* const names[] = {
10 [LMMC_STATUS_OK] = "Ok",
11 [LMMC_STATUS_INVALID_ARGUMENT] = "InvalidArgument",
12 [LMMC_STATUS_DIMENSION_MISMATCH] = "DimensionMismatch",
13 [LMMC_STATUS_ALLOCATION_FAILED] = "ResourceLimit",
14 [LMMC_STATUS_SINGULAR_MATRIX] = "SingularMatrix",
15 [LMMC_STATUS_NOT_IMPLEMENTED] = "UnsupportedExpression",
16 [LMMC_STATUS_NUMERICAL_FAILURE] = "NumericFailure",
17 [LMMC_STATUS_NOT_POSITIVE_DEFINITE] = "DomainError",
18 [LMMC_STATUS_CONVERGENCE_FAILED] = "NumericFailure",
19 [LMMC_STATUS_OUT_OF_RANGE] = "DomainError",
20 [LMMC_STATUS_INDEX_OUT_OF_BOUNDS] = "InvalidArgument",
21 [LMMC_STATUS_WARNING_MAX_DEPTH] = "ResourceLimit",
22 [LMMC_STATUS_EMPTY_INPUT] = "EmptyInput",
23 [LMMC_STATUS_UNIT_STRIP_TYPE_MISMATCH] = "UnitStripTypeMismatch",
24 [LMMC_STATUS_UNIT_STRIP_OVERFLOW] = "UnitStripOverflow",
25 [LMMC_STATUS_UNIT_STRIP_INVALID] = "UnitStripInvalid",
26 [LMMC_STATUS_UNIT_STRIP_LEGACY_SYNTAX] = "UnitStripLegacySyntax",
27 [LMMC_STATUS_NOT_INITIALIZED] = "NotInitialized",
28 [LMMC_STATUS_BUSY] = "Busy",
29 [LMMC_STATUS_REFERENCE_LIMIT] = "ResourceLimit",
30 };
31 if ((unsigned int)status >= sizeof(names) / sizeof(names[0])) {
32 return "InternalInvariant";
33 }
34 return names[(unsigned int)status];
35}
37{
38 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
39 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
40 return lmmc_std_store_finite_real((lmmc_real_t)sin((double)x), out);
41}
42
44{
45 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
46 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
47 return lmmc_std_store_finite_real((lmmc_real_t)cos((double)x), out);
48}
49
51{
52 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
53 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
54 return lmmc_std_store_finite_real((lmmc_real_t)tan((double)x), out);
55}
56
58 lmmc_real_t* out)
59{
60 double value;
61 double integral_part;
62 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
63 if (!lmmc_std_real_is_finite(x) || !lmmc_std_real_is_finite(y)) {
65 }
66 if ((double)x == 0.0 && (double)y < 0.0) {
68 }
69 if ((double)x < 0.0 && modf((double)y, &integral_part) != 0.0) {
71 }
72 value = pow((double)x, (double)y);
73 if (!isfinite(value)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
74 *out = (lmmc_real_t)value;
75 return LMMC_STATUS_OK;
76}
77
79{
80 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
81 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
82 if (x < (lmmc_real_t)-1 || x > (lmmc_real_t)1) { return LMMC_STATUS_OUT_OF_RANGE; }
83 return lmmc_std_store_finite_real((lmmc_real_t)asin((double)x), out);
84}
85
87{
88 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
89 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
90 if (x < (lmmc_real_t)-1 || x > (lmmc_real_t)1) { return LMMC_STATUS_OUT_OF_RANGE; }
91 return lmmc_std_store_finite_real((lmmc_real_t)acos((double)x), out);
92}
93
95{
96 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
97 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
98 return lmmc_std_store_finite_real((lmmc_real_t)atan((double)x), out);
99}
100
102{
103 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
104 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
105 if (x < (lmmc_real_t)0) { return LMMC_STATUS_OUT_OF_RANGE; }
106 return lmmc_std_store_finite_real((lmmc_real_t)sqrt((double)x), out);
107}
108
110{
111 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
112 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
113 return lmmc_std_store_finite_real((lmmc_real_t)exp((double)x), out);
114}
115
117{
118 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
119 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
120 if (x <= (lmmc_real_t)0) { return LMMC_STATUS_OUT_OF_RANGE; }
121 return lmmc_std_store_finite_real((lmmc_real_t)log((double)x), out);
122}
123
128
130 lmmc_real_t* out)
131{
132 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
133 if (!lmmc_std_real_is_finite(x) || !lmmc_std_real_is_finite(base)) {
135 }
136 if (x <= (lmmc_real_t)0 || base <= (lmmc_real_t)0 ||
137 base == (lmmc_real_t)1) {
139 }
140 return lmmc_std_store_finite_real(
141 (lmmc_real_t)(log((double)x) / log((double)base)), out);
142}
143
145{
146 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
147 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
148 if (x <= (lmmc_real_t)0) { return LMMC_STATUS_OUT_OF_RANGE; }
149 return lmmc_std_store_finite_real((lmmc_real_t)log10((double)x), out);
150}
151
153{
154 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
155 if (!lmmc_std_real_is_finite(x)) { return LMMC_STATUS_NUMERICAL_FAILURE; }
156 return lmmc_std_store_finite_real((lmmc_real_t)fabs((double)x), out);
157}
158
160{
161 return lmmc_std_store_finite_real((lmmc_real_t)floor((double)x), out);
162}
163
165{
166 return lmmc_std_store_finite_real((lmmc_real_t)ceil((double)x), out);
167}
168
170{
171 return lmmc_std_store_finite_real((lmmc_real_t)round((double)x), out);
172}
173
175 lmmc_real_t hi, lmmc_real_t* out)
176{
177 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
178 if (!lmmc_std_real_is_finite(x) || !lmmc_std_real_is_finite(lo) ||
179 !lmmc_std_real_is_finite(hi)) {
181 }
182 if (lo > hi) { return LMMC_STATUS_INVALID_ARGUMENT; }
183 if (x < lo) *out = lo;
184 else if (x > hi) *out = hi;
185 else *out = x;
186 return lmmc_std_store_finite_real(*out, out);
187}
double lmmc_real_t
Public and internal LMMC real type.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_CONVERGENCE_FAILED
@ LMMC_STATUS_UNIT_STRIP_TYPE_MISMATCH
@ LMMC_STATUS_UNIT_STRIP_LEGACY_SYNTAX
@ LMMC_STATUS_REFERENCE_LIMIT
@ LMMC_STATUS_OK
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_NOT_POSITIVE_DEFINITE
@ LMMC_STATUS_DIMENSION_MISMATCH
@ LMMC_STATUS_BUSY
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_SINGULAR_MATRIX
@ LMMC_STATUS_NOT_IMPLEMENTED
@ LMMC_STATUS_UNIT_STRIP_INVALID
@ LMMC_STATUS_NOT_INITIALIZED
@ LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_OUT_OF_RANGE
@ LMMC_STATUS_INDEX_OUT_OF_BOUNDS
@ LMMC_STATUS_EMPTY_INPUT
@ LMMC_STATUS_WARNING_MAX_DEPTH
@ LMMC_STATUS_UNIT_STRIP_OVERFLOW
lmmc_status_t lmmc_std_math_log10(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_sqrt(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_ceil(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_sin(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_tan(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_abs(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_ln(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_exp(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_pow(lmmc_real_t x, lmmc_real_t y, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_round(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_atan(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_log(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_log_base(lmmc_real_t x, lmmc_real_t base, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_cos(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_clamp(lmmc_real_t x, lmmc_real_t lo, lmmc_real_t hi, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_floor(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_asin(lmmc_real_t x, lmmc_real_t *out)
lmmc_status_t lmmc_std_math_acos(lmmc_real_t x, lmmc_real_t *out)
const char * lmmc_std_error_name(lmmc_status_t status)
将 LMMC 状态码映射为 LSR 规范定义的稳定诊断名称。