12 if (!lmmc_std_real_is_finite(real) || !lmmc_std_real_is_finite(imag)) {
22 return lmmc_std_store_finite_real(z->
real, out);
29 return lmmc_std_store_finite_real(z->
imag, out);
52 return lmmc_std_store_finite_real(value, out);
60 if (!lmmc_std_complex_is_finite(lhs) ||
61 !lmmc_std_complex_is_finite(rhs)) {
74 if (!lmmc_std_complex_is_finite(z)) {
77 real_hash = lmmc_std_real_hash_bits(z->
real);
78 imag_hash = lmmc_std_real_hash_bits(z->
imag);
79 *out = lmmc_std_hash_mix64(real_hash ^
80 (imag_hash + UINT64_C(0x9e3779b97f4a7c15) +
81 (real_hash << 6) + (real_hash >> 2)));
88 key.
real = lmmc_std_num_set_key(key.
real);
89 key.
imag = lmmc_std_num_set_key(key.
imag);
95 return set && (set->
size == 0 || set->
data);
102 for (
size_t i = 0; i < set->
size; ++i) {
103 if (!lmmc_std_complex_is_finite(&set->
data[i])) {
110static int lmmc_std_complex_values_equal(
const lmmc_complex_t* lhs,
118static int lmmc_std_complex_set_contains_value(
122 for (
size_t i = 0; i < set->
size; ++i) {
123 if (lmmc_std_complex_values_equal(&set->
data[i], value)) {
return 1; }
138 if (!lmmc_safe_mul_size(capacity,
sizeof(
lmmc_complex_t), &bytes)) {
151 if (!set || !lmmc_std_complex_is_finite(value)) {
154 if (lmmc_std_complex_set_contains_value(set, value)) {
158 set->
data[set->
size++] = lmmc_std_complex_set_key(value);
168 status = lmmc_std_complex_set_alloc(count, out);
170 for (
size_t i = 0; i < count; ++i) {
171 status = lmmc_std_complex_set_append_unique(out, &values[i]);
198 if (!lmmc_std_complex_is_finite(value)) {
201 status = lmmc_std_complex_set_require_finite(set);
203 *out = lmmc_std_complex_set_contains_value(set, value);
214 status = lmmc_std_complex_set_require_finite(lhs);
216 status = lmmc_std_complex_set_require_finite(rhs);
218 for (
size_t i = 0; i < lhs->
size; ++i) {
219 if (!lmmc_std_complex_set_contains_value(rhs, &lhs->
data[i])) {
234 if (!out || (
const void*)out == (
const void*)lhs ||
235 (
const void*)out == (
const void*)rhs) {
238 status = lmmc_std_complex_set_require_finite(lhs);
240 status = lmmc_std_complex_set_require_finite(rhs);
242 if (lhs->
size > ((
size_t)-1) - rhs->size) {
245 return lmmc_std_complex_set_alloc(lhs->
size + rhs->size, out);
253 lmmc_status_t status = lmmc_std_complex_set_binary_alloc(lhs, rhs, out);
255 for (
size_t i = 0; i < lhs->
size; ++i) {
256 status = lmmc_std_complex_set_append_unique(out, &lhs->
data[i]);
261 for (
size_t i = 0; i < rhs->
size; ++i) {
262 status = lmmc_std_complex_set_append_unique(out, &rhs->
data[i]);
278 lmmc_status_t status = lmmc_std_complex_set_binary_alloc(lhs, rhs, out);
280 for (
size_t i = 0; i < lhs->
size; ++i) {
281 if (lmmc_std_complex_set_contains_value(rhs, &lhs->
data[i])) {
282 status = lmmc_std_complex_set_append_unique(out, &lhs->
data[i]);
299 lmmc_status_t status = lmmc_std_complex_set_binary_alloc(lhs, rhs, out);
301 for (
size_t i = 0; i < lhs->
size; ++i) {
302 if (!lmmc_std_complex_set_contains_value(rhs, &lhs->
data[i])) {
303 status = lmmc_std_complex_set_append_unique(out, &lhs->
data[i]);
320 lmmc_status_t status = lmmc_std_complex_set_binary_alloc(lhs, rhs, out);
322 for (
size_t i = 0; i < lhs->
size; ++i) {
323 if (!lmmc_std_complex_set_contains_value(rhs, &lhs->
data[i])) {
324 status = lmmc_std_complex_set_append_unique(out, &lhs->
data[i]);
330 for (
size_t i = 0; i < rhs->
size; ++i) {
331 if (!lmmc_std_complex_set_contains_value(lhs, &rhs->
data[i])) {
332 status = lmmc_std_complex_set_append_unique(out, &rhs->
data[i]);
lmmc_status_t lmmc_complex_create(lmmc_real_t real, lmmc_real_t imag, lmmc_complex_t *out)
从笛卡尔坐标构造复数.
lmmc_status_t lmmc_complex_conj(const lmmc_complex_t *z, lmmc_complex_t *out)
复数共轭: .
lmmc_status_t lmmc_complex_modulus(const lmmc_complex_t *z, lmmc_real_t *out)
采用缩放计算复数模: .
double lmmc_real_t
Public and internal LMMC real type.
void * lmmc_memory_alloc(size_t size)
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT
lmmc_status_t lmmc_std_math_complex_abs(const lmmc_complex_t *z, lmmc_real_t *out)
为 std.math.abs 计算复数模。
lmmc_status_t lmmc_std_math_conj(const lmmc_complex_t *z, lmmc_complex_t *out)
为 std.math.conj 计算复共轭。
lmmc_status_t lmmc_std_math_imag(const lmmc_complex_t *z, lmmc_real_t *out)
提取复数的虚部。
lmmc_status_t lmmc_std_math_real(const lmmc_complex_t *z, lmmc_real_t *out)
提取复数的实部。
lmmc_status_t lmmc_std_math_complex(lmmc_real_t real, lmmc_real_t imag, lmmc_complex_t *out)
由实部与虚部构造复数。
void lmmc_std_complex_set_destroy(lmmc_std_complex_set_t *set)
lmmc_status_t lmmc_std_complex_set_union(const lmmc_std_complex_set_t *lhs, const lmmc_std_complex_set_t *rhs, lmmc_std_complex_set_t *out)
lmmc_status_t lmmc_std_complex_set_subset(const lmmc_std_complex_set_t *lhs, const lmmc_std_complex_set_t *rhs, int *out)
lmmc_status_t lmmc_std_complex_set_difference(const lmmc_std_complex_set_t *lhs, const lmmc_std_complex_set_t *rhs, lmmc_std_complex_set_t *out)
lmmc_status_t lmmc_std_math_complex_equal(const lmmc_complex_t *lhs, const lmmc_complex_t *rhs, int *out)
按 LSR 规范的结构键语义比较复数值。
lmmc_status_t lmmc_std_complex_set_intersection(const lmmc_std_complex_set_t *lhs, const lmmc_std_complex_set_t *rhs, lmmc_std_complex_set_t *out)
lmmc_status_t lmmc_std_math_complex_hash(const lmmc_complex_t *z, uint64_t *out)
为 LSR 规范的表键计算有限复数哈希。
lmmc_status_t lmmc_std_complex_set_contains(const lmmc_std_complex_set_t *set, const lmmc_complex_t *value, int *out)
lmmc_status_t lmmc_std_complex_set_make(const lmmc_complex_t *values, size_t count, lmmc_std_complex_set_t *out)
构造去重的有限复数集合。
lmmc_status_t lmmc_std_complex_set_symmetric_difference(const lmmc_std_complex_set_t *lhs, const lmmc_std_complex_set_t *rhs, lmmc_std_complex_set_t *out)