|
LMMC
Lamina Mathematic core
|
复数类型与运算模块. 更多...
结构体 | |
| struct | lmmc_complex_t |
| 复数类型,包含实部与虚部. 更多... | |
| struct | lmmc_cvec_t |
| 复数稠密向量. 更多... | |
| struct | lmmc_cmat_t |
| 复数稠密矩阵(行优先存储). 更多... | |
函数 | |
| lmmc_status_t | lmmc_complex_create (lmmc_real_t real, lmmc_real_t imag, lmmc_complex_t *out) |
| 从笛卡尔坐标构造复数. | |
| lmmc_status_t | lmmc_complex_from_polar (lmmc_real_t r, lmmc_real_t theta, lmmc_complex_t *out) |
| 从极坐标构造复数. | |
| lmmc_status_t | lmmc_complex_add (const lmmc_complex_t *a, const lmmc_complex_t *b, lmmc_complex_t *out) |
| 复数加法: \( \text{out} = a + b \). | |
| lmmc_status_t | lmmc_complex_sub (const lmmc_complex_t *a, const lmmc_complex_t *b, lmmc_complex_t *out) |
| 复数减法: \( \text{out} = a - b \). | |
| lmmc_status_t | lmmc_complex_mul (const lmmc_complex_t *a, const lmmc_complex_t *b, lmmc_complex_t *out) |
| 复数乘法: \( \text{out} = a \cdot b \). | |
| lmmc_status_t | lmmc_complex_div (const lmmc_complex_t *a, const lmmc_complex_t *b, lmmc_complex_t *out) |
| 复数除法: \( \text{out} = a / b \). | |
| lmmc_status_t | lmmc_complex_conj (const lmmc_complex_t *z, lmmc_complex_t *out) |
| 复数共轭: \( \text{out} = \overline{z} = (\text{real}, -\text{imag}) \). | |
| lmmc_status_t | lmmc_complex_modulus (const lmmc_complex_t *z, lmmc_real_t *out) |
| 采用缩放计算复数模: \( |z| = \sqrt{\text{real}^2 + \text{imag}^2} \). | |
| lmmc_status_t | lmmc_complex_arg (const lmmc_complex_t *z, lmmc_real_t *out) |
| 复数辐角: \( \arg(z) = \text{atan2}(\text{imag}, \text{real}) \). | |
| lmmc_status_t | lmmc_complex_exp (const lmmc_complex_t *z, lmmc_complex_t *out) |
| 复数指数函数: \( e^z = e^x (\cos y + i \sin y) \),其中 \( z = x + iy \). | |
| lmmc_status_t | lmmc_complex_log (const lmmc_complex_t *z, lmmc_complex_t *out) |
| 复数主值对数: \( \ln z = \ln(\operatorname{hypot}(x,y)) + i \arg(z) \). | |
| lmmc_status_t | lmmc_complex_sqrt (const lmmc_complex_t *z, lmmc_complex_t *out) |
| 采用缩放算法计算复数主值平方根. | |
| lmmc_status_t | lmmc_complex_sin (const lmmc_complex_t *z, lmmc_complex_t *out) |
| 复数正弦: \( \sin(z) = \sin(x)\cosh(y) + i\cos(x)\sinh(y) \). | |
| lmmc_status_t | lmmc_complex_cos (const lmmc_complex_t *z, lmmc_complex_t *out) |
| 复数余弦: \( \cos(z) = \cos(x)\cosh(y) - i\sin(x)\sinh(y) \). | |
| lmmc_status_t | lmmc_complex_pow (const lmmc_complex_t *base, const lmmc_complex_t *exp, lmmc_complex_t *out) |
| 复数幂: \( \text{base}^{\text{exp}} = e^{\text{exp} \cdot \ln(\text{base})} \). | |
| lmmc_status_t | lmmc_cvec_create (size_t size, lmmc_cvec_t *out) |
分配并初始化一个长度为 size 的复数向量,所有元素置零. | |
| lmmc_status_t | lmmc_cmat_create (size_t rows, size_t cols, lmmc_cmat_t *out) |
分配并初始化一个 rows x cols 的复数矩阵,所有元素置零. | |
| void | lmmc_cvec_destroy (lmmc_cvec_t *vec) |
| 销毁复数向量,释放其拥有的底层缓冲区. | |
| void | lmmc_cmat_destroy (lmmc_cmat_t *mat) |
| 销毁复数矩阵,释放其拥有的底层缓冲区. | |
复数类型与运算模块.
本模块提供复数类型 lmmc_complex_t 及其基本算术运算(加,减,乘,除, 共轭,模,辐角),极坐标构造,超越函数(exp,log,sqrt,sin,cos,pow), 以及复数向量 lmmc_cvec_t 和复数矩阵 lmmc_cmat_t 的生命周期管理.
在文件 complex.h 中定义.
| struct lmmc_complex_t |
| struct lmmc_cvec_t |
| 成员变量 | ||
|---|---|---|
| size_t | size |
元素个数. |
| lmmc_complex_t * | data |
数据缓冲区起始地址. |
| int | owns_data |
是否拥有缓冲区所有权(非 0 表示销毁时释放). |
| struct lmmc_cmat_t |
复数稠密矩阵(行优先存储).
元素 (i,j) 位于 data[i * stride + j],其中 stride >= cols. 当 lmmc_cmat_t::owns_data 非零时,lmmc_cmat_destroy 会释放 data.
| 成员变量 | ||
|---|---|---|
| size_t | rows |
行数. |
| size_t | cols |
列数. |
| size_t | stride |
行步距(每行实际占用的元素数,>= |
| lmmc_complex_t * | data |
数据缓冲区起始地址. |
| int | owns_data |
是否拥有缓冲区所有权(非 0 表示销毁时释放). |
| lmmc_status_t lmmc_complex_create | ( | lmmc_real_t | real, |
| lmmc_real_t | imag, | ||
| lmmc_complex_t * | out ) |
从笛卡尔坐标构造复数.
将 real 和 imag 写入输出参数 out.
| [in] | real | 实部. |
| [in] | imag | 虚部. |
| [out] | out | 输出复数. |
引用了 lmmc_complex_t::imag, lmmc_complex_create(), LMMC_REAL_SET, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_create(), lmmc_std_math_complex() , 以及 lmmc_std_math_i().
| lmmc_status_t lmmc_complex_from_polar | ( | lmmc_real_t | r, |
| lmmc_real_t | theta, | ||
| lmmc_complex_t * | out ) |
从极坐标构造复数.
计算 \( z = r \cdot (\cos\theta + i \cdot \sin\theta) \). r 必须为有限非负数,theta 必须有限. 当 r 为 0 时,结果为 0+0i.
| [in] | r | 有限非负的模. |
| [in] | theta | 有限辐角(弧度). |
| [out] | out | 输出复数. |
引用了 lmmc_complex_t::imag, lmmc_complex_from_polar(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_from_polar().
| lmmc_status_t lmmc_complex_add | ( | const lmmc_complex_t * | a, |
| const lmmc_complex_t * | b, | ||
| lmmc_complex_t * | out ) |
复数加法: \( \text{out} = a + b \).
| [in] | a | 加数. |
| [in] | b | 加数. |
| [out] | out | 输出和. |
引用了 lmmc_complex_t::imag, lmmc_complex_add(), LMMC_REAL_ADD, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_add().
| lmmc_status_t lmmc_complex_sub | ( | const lmmc_complex_t * | a, |
| const lmmc_complex_t * | b, | ||
| lmmc_complex_t * | out ) |
复数减法: \( \text{out} = a - b \).
| [in] | a | 被减数. |
| [in] | b | 减数. |
| [out] | out | 输出差. |
引用了 lmmc_complex_t::imag, lmmc_complex_sub(), LMMC_REAL_SUB, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_sub().
| lmmc_status_t lmmc_complex_mul | ( | const lmmc_complex_t * | a, |
| const lmmc_complex_t * | b, | ||
| lmmc_complex_t * | out ) |
复数乘法: \( \text{out} = a \cdot b \).
实部和虚部分别计算二项乘积和,普通幅值使用 FMA 与乘积残差保留消减余量; 乘积或结果位于指数边界时,使用尾数与公共二进制指数完成运算。 两个结果均为有限值时写入 out;输出可以与任一输入共用存储。
| [in] | a | 乘数. |
| [in] | b | 乘数. |
| [out] | out | 输出积. |
引用了 lmmc_complex_t::imag, lmmc_complex_mul(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_mul() , 以及 lmmc_complex_pow().
| lmmc_status_t lmmc_complex_div | ( | const lmmc_complex_t * | a, |
| const lmmc_complex_t * | b, | ||
| lmmc_complex_t * | out ) |
复数除法: \( \text{out} = a / b \).
分子实部、虚部及分母平方模分别按二进制指数缩放,在尾数除法后恢复尺度。 除数 b 的两个分量均为零时返回错误。 支持 out 与任一输入重合;失败时保持输出不变。
| [in] | a | 有限被除数. |
| [in] | b | 有限除数(模不可为零). |
| [out] | out | 输出商. |
引用了 lmmc_complex_t::imag, lmmc_complex_div(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_div().
| lmmc_status_t lmmc_complex_conj | ( | const lmmc_complex_t * | z, |
| lmmc_complex_t * | out ) |
复数共轭: \( \text{out} = \overline{z} = (\text{real}, -\text{imag}) \).
| [in] | z | 输入复数. |
| [out] | out | 输出共轭. |
引用了 lmmc_complex_t::imag, lmmc_complex_conj(), LMMC_REAL_NEG, LMMC_REAL_SET, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_conj() , 以及 lmmc_std_math_conj().
| lmmc_status_t lmmc_complex_modulus | ( | const lmmc_complex_t * | z, |
| lmmc_real_t * | out ) |
采用缩放计算复数模: \( |z| = \sqrt{\text{real}^2 + \text{imag}^2} \).
| [in] | z | 有限复数. |
| [out] | out | 输出模值(非负实数). |
引用了 lmmc_complex_t::imag, lmmc_complex_modulus(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_modulus() , 以及 lmmc_std_math_complex_abs().
| lmmc_status_t lmmc_complex_arg | ( | const lmmc_complex_t * | z, |
| lmmc_real_t * | out ) |
复数辐角: \( \arg(z) = \text{atan2}(\text{imag}, \text{real}) \).
返回值范围为 \( (-\pi, \pi] \).
| [in] | z | 输入复数. |
| [out] | out | 输出辐角(弧度). |
引用了 lmmc_complex_t::imag, lmmc_complex_arg(), LMMC_REAL_ATAN2, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_arg().
| lmmc_status_t lmmc_complex_exp | ( | const lmmc_complex_t * | z, |
| lmmc_complex_t * | out ) |
复数指数函数: \( e^z = e^x (\cos y + i \sin y) \),其中 \( z = x + iy \).
正常幅值直接计算;当实指数落在溢出或次正规数范围时,使用两个 \(e^{x/2}\) 因子,将三角因子纳入最终乘积后形成结果分量。 输出可以与输入共用存储;成功时写入完整结果,失败时保持输出不变。
| [in] | z | 输入复数. |
| [out] | out | 输出 \( e^z \). |
z = x + iy 时,e^z = e^x * (cos(y) + i*sin(y)).
引用了 lmmc_complex_t::imag, lmmc_complex_exp(), LMMC_REAL_COS, LMMC_REAL_EXP, LMMC_REAL_MUL, LMMC_REAL_SIN, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_exp() , 以及 lmmc_complex_pow().
| lmmc_status_t lmmc_complex_log | ( | const lmmc_complex_t * | z, |
| lmmc_complex_t * | out ) |
复数主值对数: \( \ln z = \ln(\operatorname{hypot}(x,y)) + i \arg(z) \).
最大分量绝对值位于 [0.5, 1] 时,实部通过补偿平方和计算 log1p(x*x + y*y - 1)/2,保留单位模附近的小量。 其他幅值使用 log(max(|x|,|y|)) + log1p(ratio^2)/2; 有限输入即使数学模超出 double 范围仍可返回有限对数。
当 z 的模为零时(即 z = 0+0i),返回域错误. 负实轴两侧由虚部的有符号零区分,主辐角分别为 \(+\pi\) 和 \(-\pi\)。 输出可以与输入共用存储;成功时写入完整结果,失败时保持输出不变。
| [in] | z | 有限复数(模不可为零). |
| [out] | out | 输出主值对数. |
Compensated squared modulus supplies the small argument of log1p. Ordered squares use FastTwoSum; FMA supplies product residuals. TwoSum carries the low-order terms through residual cancellation.
引用了 lmmc_complex_t::imag, lmmc_complex_log(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, LMMC_STATUS_OUT_OF_RANGE , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_log() , 以及 lmmc_complex_pow().
| lmmc_status_t lmmc_complex_sqrt | ( | const lmmc_complex_t * | z, |
| lmmc_complex_t * | out ) |
采用缩放算法计算复数主值平方根.
即使有限实部与虚部对应的数学模超过可表示范围,只要平方根的两个 分量仍可表示,算法也通过输入尺度分解返回有限结果;同时避免 \(x^2+y^2\) 和 \(|z| \pm x\) 的中间溢出与相消。 虚部非零时,以其幅值除以大分量幅值的两倍得到小分量幅值。 该分母保持有限且非零;缩放因子在除法前合并,使次正规小分量只经历一次除法舍入。 结果实部为非负值(零取正零),虚部保留输入虚部的符号,包括有符号零。 输出可以与输入共用存储;成功时写入完整结果,失败时保持输出不变。
| [in] | z | 有限复数. |
| [out] | out | 输出主值平方根. |
引用了 lmmc_complex_t::imag, lmmc_complex_sqrt(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_sqrt().
| lmmc_status_t lmmc_complex_sin | ( | const lmmc_complex_t * | z, |
| lmmc_complex_t * | out ) |
复数正弦: \( \sin(z) = \sin(x)\cosh(y) + i\cos(x)\sinh(y) \).
有限双曲因子使用直接乘积;双曲因子溢出时,将主导指数项 分解为两个 \(e^{|y|/2}\) 因子,与三角因子共同形成结果分量。 输出可以与输入共用存储;成功时写入完整结果,失败时保持输出不变。
| [in] | z | 输入复数. |
| [out] | out | 输出复数正弦值. |
z = x + iy 时,sin(z) = sin(x)*cosh(y) + i*cos(x)*sinh(y).
引用了 lmmc_complex_t::imag, lmmc_complex_sin(), LMMC_REAL_COS, LMMC_REAL_SIN, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_sin().
| lmmc_status_t lmmc_complex_cos | ( | const lmmc_complex_t * | z, |
| lmmc_complex_t * | out ) |
复数余弦: \( \cos(z) = \cos(x)\cosh(y) - i\sin(x)\sinh(y) \).
与复数正弦共用双曲乘积缩放算法,在最终分量的幅值范围内完成计算。 输出可以与输入共用存储;成功时写入完整结果,失败时保持输出不变。
| [in] | z | 输入复数. |
| [out] | out | 输出复数余弦值. |
z = x + iy 时,cos(z) = cos(x)*cosh(y) - i*sin(x)*sinh(y).
引用了 lmmc_complex_t::imag, lmmc_complex_cos(), LMMC_REAL_COS, LMMC_REAL_SIN, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_cos().
| lmmc_status_t lmmc_complex_pow | ( | const lmmc_complex_t * | base, |
| const lmmc_complex_t * | exp, | ||
| lmmc_complex_t * | out ) |
复数幂: \( \text{base}^{\text{exp}} = e^{\text{exp} \cdot \ln(\text{base})} \).
先验证两个输入均为有限复数。非零底数的实整数指数使用二进制平方求幂, 负整数指数先取倒数;其他指数使用主值对数计算。 对零底数,本接口定义零次幂为 1+0i;指数实部为正时返回 0+0i; 指数实部为负或指数为非零纯虚数时返回域错误。 输出可以与任一输入共用存储;成功时写入完整结果,失败时保持输出不变。
| [in] | base | 有限底数. |
| [in] | exp | 有限指数. |
| [out] | out | 输出幂值. |
引用了 lmmc_complex_t::imag, lmmc_complex_exp(), lmmc_complex_log(), lmmc_complex_mul(), lmmc_complex_pow(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 lmmc_complex_t::real.
被这些函数引用 lmmc_complex_pow().
| lmmc_status_t lmmc_cvec_create | ( | size_t | size, |
| lmmc_cvec_t * | out ) |
分配并初始化一个长度为 size 的复数向量,所有元素置零.
内部通过 lmmc_alloc 分配 size 个 lmmc_complex_t 的连续缓冲区, 所有实部和虚部初始化为 0,owns_data 置 1.
| [in] | size | 元素个数,必须 > 0. |
| [out] | out | 输出向量结构体.调用方需配对调用 lmmc_cvec_destroy 释放. |
引用了 lmmc_cvec_t::data, lmmc_cvec_create(), lmmc_memory_alloc(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_cvec_t::owns_data , 以及 lmmc_cvec_t::size.
被这些函数引用 lmmc_cvec_create().
| lmmc_status_t lmmc_cmat_create | ( | size_t | rows, |
| size_t | cols, | ||
| lmmc_cmat_t * | out ) |
分配并初始化一个 rows x cols 的复数矩阵,所有元素置零.
内部通过 lmmc_alloc 分配 rows*cols 个 lmmc_complex_t 的连续缓冲区, stride 设为 cols(紧凑存储),所有实部和虚部初始化为 0,owns_data 置 1.
| [in] | rows | 行数,必须 > 0. |
| [in] | cols | 列数,必须 > 0. |
| [out] | out | 输出矩阵结构体.调用方需配对调用 lmmc_cmat_destroy 释放. |
引用了 lmmc_cmat_t::cols, lmmc_cmat_t::data, lmmc_cmat_create(), lmmc_memory_alloc(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_cmat_t::owns_data, lmmc_cmat_t::rows , 以及 lmmc_cmat_t::stride.
被这些函数引用 lmmc_cmat_create().
| void lmmc_cvec_destroy | ( | lmmc_cvec_t * | vec | ) |
销毁复数向量,释放其拥有的底层缓冲区.
若 vec->owns_data 非零,调用 lmmc_free 释放 vec->data; 否则仅将结构体字段清零.对 NULL 指针安全.
| [in,out] | vec | 待销毁的复数向量,可为 NULL. |
引用了 lmmc_cvec_t::data, lmmc_cvec_destroy(), lmmc_memory_free(), lmmc_cvec_t::owns_data , 以及 lmmc_cvec_t::size.
被这些函数引用 lmmc_cvec_destroy().
| void lmmc_cmat_destroy | ( | lmmc_cmat_t * | mat | ) |
销毁复数矩阵,释放其拥有的底层缓冲区.
若 mat->owns_data 非零,调用 lmmc_free 释放 mat->data; 否则仅将结构体字段清零.对 NULL 指针安全.
| [in,out] | mat | 待销毁的复数矩阵,可为 NULL. |
引用了 lmmc_cmat_t::cols, lmmc_cmat_t::data, lmmc_cmat_destroy(), lmmc_memory_free(), lmmc_cmat_t::owns_data, lmmc_cmat_t::rows , 以及 lmmc_cmat_t::stride.
被这些函数引用 lmmc_cmat_destroy().