LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
complex.c 文件参考

复数类型构造,算术运算与复数向量/矩阵生命周期管理. 更多...

#include <float.h>
#include <math.h>
#include <string.h>
#include "memory_bridge.h"
#include "internal.h"
#include "lmmc/config.h"
#include "lmmc/complex.h"
complex.c 的引用(Include)关系图:

浏览该文件的源代码.

函数

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)
 销毁复数矩阵,释放其拥有的底层缓冲区.

详细描述

复数类型构造,算术运算与复数向量/矩阵生命周期管理.

在文件 complex.c 中定义.

函数说明

◆ lmmc_complex_create()

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输出复数.
返回

在文件 complex.c 第 25 行定义.

引用了 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_complex_from_polar()

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输出复数.
返回

在文件 complex.c 第 35 行定义.

引用了 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_complex_add()

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输出和.
返回

在文件 complex.c 第 57 行定义.

引用了 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_complex_sub()

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输出差.
返回

在文件 complex.c 第 70 行定义.

引用了 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_complex_mul()

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输出积.
返回

在文件 complex.c 第 149 行定义.

引用了 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_complex_div()

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输出商.
返回

在文件 complex.c 第 169 行定义.

引用了 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_complex_conj()

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输出共轭.
返回

在文件 complex.c 第 204 行定义.

引用了 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_complex_modulus()

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输出模值(非负实数).
返回

在文件 complex.c 第 217 行定义.

引用了 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_complex_arg()

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输出辐角(弧度).
返回

在文件 complex.c 第 235 行定义.

引用了 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_complex_exp()

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}\) 因子,将三角因子纳入最终乘积后形成结果分量。 输出可以与输入共用存储;成功时写入完整结果,失败时保持输出不变。

参见
ISO C11 committee draft N1570, 7.3.7.1 (cexp). https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
参数
[in]z输入复数.
[out]out输出 \( e^z \).
返回

z = x + iy 时,e^z = e^x * (cos(y) + i*sin(y)).

在文件 complex.c 第 247 行定义.

引用了 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_complex_log()

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\)。 输出可以与输入共用存储;成功时写入完整结果,失败时保持输出不变。

参见
ISO C11 committee draft N1570, 7.3.7.2 (clog). https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
参数
[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.

参见
Ogita, Rump, Oishi, "Accurate Sum and Dot Product" (2005), Algorithms 1.1 (FastTwoSum) and 3.5 (TwoProductFMA). https://doi.org/10.1137/030601818

在文件 complex.c 第 280 行定义.

引用了 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_complex_sqrt()

lmmc_status_t lmmc_complex_sqrt ( const lmmc_complex_t * z,
lmmc_complex_t * out )

采用缩放算法计算复数主值平方根.

即使有限实部与虚部对应的数学模超过可表示范围,只要平方根的两个 分量仍可表示,算法也通过输入尺度分解返回有限结果;同时避免 \(x^2+y^2\) 和 \(|z| \pm x\) 的中间溢出与相消。 虚部非零时,以其幅值除以大分量幅值的两倍得到小分量幅值。 该分母保持有限且非零;缩放因子在除法前合并,使次正规小分量只经历一次除法舍入。 结果实部为非负值(零取正零),虚部保留输入虚部的符号,包括有符号零。 输出可以与输入共用存储;成功时写入完整结果,失败时保持输出不变。

参见
ISO C11 committee draft N1570, 7.3.8.3 (csqrt). https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
参数
[in]z有限复数.
[out]out输出主值平方根.
返回

在文件 complex.c 第 331 行定义.

引用了 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_complex_sin()

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}\) 因子,与三角因子共同形成结果分量。 输出可以与输入共用存储;成功时写入完整结果,失败时保持输出不变。

参见
NIST DLMF, 4.28.1 and 4.28.2, hyperbolic exponential identities. https://dlmf.nist.gov/4.28
参数
[in]z输入复数.
[out]out输出复数正弦值.
返回

z = x + iy 时,sin(z) = sin(x)*cosh(y) + i*cos(x)*sinh(y).

在文件 complex.c 第 404 行定义.

引用了 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_complex_cos()

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_complex_sin
参数
[in]z输入复数.
[out]out输出复数余弦值.
返回

z = x + iy 时,cos(z) = cos(x)*cosh(y) - i*sin(x)*sinh(y).

在文件 complex.c 第 428 行定义.

引用了 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_complex_pow()

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; 指数实部为负或指数为非零纯虚数时返回域错误。 输出可以与任一输入共用存储;成功时写入完整结果,失败时保持输出不变。

参见
ISO C11 committee draft N1570, 7.3.8.2 (cpow), principal branch. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
参数
[in]base有限底数.
[in]exp有限指数.
[out]out输出幂值.
返回

在文件 complex.c 第 518 行定义.

引用了 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_cvec_create()

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 释放.
返回
副作用
  • 分配堆内存(owns_data=1).out 的所有字段被覆写.

在文件 complex.c 第 558 行定义.

引用了 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_cmat_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 释放.
返回
副作用
  • 分配堆内存(owns_data=1).out 的所有字段被覆写.

在文件 complex.c 第 583 行定义.

引用了 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().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_cvec_destroy()

void lmmc_cvec_destroy ( lmmc_cvec_t * vec)

销毁复数向量,释放其拥有的底层缓冲区.

若 vec->owns_data 非零,调用 lmmc_free 释放 vec->data; 否则仅将结构体字段清零.对 NULL 指针安全.

参数
[in,out]vec待销毁的复数向量,可为 NULL.
副作用
  • 若 owns_data:释放堆内存,vec->data 置 NULL,size 清零.
  • 若 !owns_data:仅清零结构体字段,不释放外部缓冲区.
  • 销毁后该向量不可再用于任何运算.

在文件 complex.c 第 613 行定义.

引用了 lmmc_cvec_t::data, lmmc_cvec_destroy(), lmmc_memory_free(), lmmc_cvec_t::owns_data , 以及 lmmc_cvec_t::size.

被这些函数引用 lmmc_cvec_destroy().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_cmat_destroy()

void lmmc_cmat_destroy ( lmmc_cmat_t * mat)

销毁复数矩阵,释放其拥有的底层缓冲区.

若 mat->owns_data 非零,调用 lmmc_free 释放 mat->data; 否则仅将结构体字段清零.对 NULL 指针安全.

参数
[in,out]mat待销毁的复数矩阵,可为 NULL.
副作用
  • 若 owns_data:释放堆内存,mat->data 置 NULL,rows/cols/stride 清零.
  • 若 !owns_data:仅清零结构体字段,不释放外部缓冲区.
  • 销毁后该矩阵不可再用于任何运算.

在文件 complex.c 第 626 行定义.

引用了 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().

函数调用图:
这是这个函数的调用关系图: