Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

32-bit Scalar API

#define S32_SQRT_MAX_DEPTH (31)

用于计算s32_sqrt()的最大位深度。


float s32_to_f32()

将浮点值打包成IEEE 754单精度浮点数。

返回的值是最接近于 m2pm \cdot 2^{p} 的可表示近似值,其中 mmmantissappexp

**注意:**这个操作可能会导致精度损失。

示例:

// 将 -12345678 * 2^{-13} 打包成浮点数
int32_t mant = -12345678;
exponent_t exp = -13;
float val = s32_to_f32(mant, exp);

printf("%e <-- %ld * 2^(%d)\n", val, mant, exp);

参数:

  • const int32_t mantissa – [out] 要打包的值的尾数
  • const exponent_t exp – [out] 要打包的值的指数

返回值: 输入值的float表示


int16_t s32_to_s16()

将32位浮点标量转换为16位浮点标量。

将由32位尾数b和指数b_exp表示的32位浮点标量转换为由返回的16位尾数和输出指数a_exp表示的16位浮点标量。

参数:

  • exponent_t* a_exp – [out] 输出指数
  • const int32_t b – [out] 32位输入尾数
  • const exponent_t b_exp – [out] 输入指数

返回值: 16位输出尾数


int32_t s32_sqrt()

计算32位浮点标量的平方根。

bb_exp一起表示输入 b2b_expb \cdot 2^{b\_exp}。同样,aa_exp一起表示结果 a2a_expa \cdot 2^{a\_exp}

depth表示将计算的最高有效位数。这里使用较小的值可以提高执行速度,但会降低精度。depth的最大有效值为@ref S32_SQRT_MAX_DEPTH。

操作: a2a_exp(b2b_exp)a \cdot 2^{a\_exp} \leftarrow \sqrt{\left( b \cdot 2^{b\_exp} \right)}

参数:

  • exponent_t* a_exp – [out] 输出指数 a_expa\_exp
  • const int32_t b – [out] 输入尾数 bb
  • const exponent_t b_exp – [out] 输入指数 b_expb\_exp
  • const unsigned depth – [out] 要计算的最高有效位数

返回值: 输出尾数 aa


int32_t s32_inverse()

计算32位整数的倒数。

b表示整数 bbaa_exp一起表示结果 a2a_expa \cdot 2^{a\_exp}

操作: a2a_exp1ba \cdot 2^{a\_exp} \leftarrow \frac{1}{b}

定点或浮点:

如果 bb 是具有隐式或显式指数 b_expb\_exp 的定点或浮点值的尾数,则

1b2b_exp=1b2b_exp=a2a_exp2b_exp=a2a_expb_exp\begin{aligned} \frac{1}{b \cdot 2^{b\_exp}} &= \frac{1}{b} \cdot 2^{-b\_exp} \\ &= a \cdot 2^{a\_exp} \cdot 2^{-b\_exp} \\ &= a \cdot 2^{a\_exp - b\_exp} \end{aligned}

因此,应该从输出指数 a_expa\_exp 中减去 b_expb\_exp

参数:

  • exponent_t* a_exp – [out] 输出指数 a_expa\_exp
  • const int32_t b – [out] 输入整数 bb

返回值: 输出尾数 aa


int32_t s32_mul()

计算两个32位浮点标量的乘积。

aa_exp一起表示结果 a2a_expa \cdot 2^{a\_exp}

bb_exp一起表示结果 b2b_expb \cdot 2^{b\_exp}

cc_exp一起表示结果 c2c_expc \cdot 2^{c\_exp}

操作: a2a_exp(b2b_exp)(c2c_exp)a \cdot 2^{a\_exp} \leftarrow \left( b\cdot 2^{b\_exp} \right) \cdot \left( c\cdot 2^{c\_exp} \right)

参数:

  • exponent_t* a_exp – [out] 输出指数 a_expa\_exp
  • const int32_t b – [out] 第一个输入尾数 bb
  • const int32_t c – [out] 第二个输入尾数 cc
  • const exponent_t b_exp – [out] 第一个输入指数 b_expb\_exp
  • const exponent_t c_exp – [out] 第二个输入指数 c_expc\_exp

返回值: 输出尾数 aa


sbrad_t radians_to_sbrads()

将角度从弧度转换为一种修改的二进制表示。

某些三角函数(例如sbrad_sin())需要其参数以修改的角度表示,而不是以弧度(例如radian_q24_t)指定的角度。修改的二进制表示考虑了sin(θ)sin(\theta)函数的各种属性,以简化某些操作。

对于任何角度 θ\theta,存在唯一的角度 α\alpha,其中 1α1-1\le\alpha\le1sin(π2α)=sin(θ)sin(\frac{\pi}{2}\alpha) = sin(\theta)。这个函数实际上只是将输入角度 θ\theta 映射到该区域中的相应角度 α\alpha,并以Q1.31格式返回结果。

在这个库中,结果角度 α\alpha 的单位被称为'sbrad'。'brad'是因为 α\alpha 是一种二进制角度测量,'s'是因为考虑到了 sin(θ)sin(\theta) 的对称性。

参数:

  • const radian_q24_t theta – [out] 输入角度 θ\theta,以弧度表示(Q8.24)

返回值: 输出角度 α\alpha,以sbrads表示


q2_30 sbrad_sin()

计算指定角度的正弦值。

该函数计算 sin(π2θ)sin(\frac{\pi}{2}\theta),并以Q2.30格式返回结果。

输入角度 θ\theta 必须用sbrads表示(参见radians_to_sbrads),并且必须表示为介于±0.5\pm 0.5(包括边界)之间的值(作为Q1.31)。

操作:

sin(π2θ)sin(\frac{\pi}{2}\theta)

参数:

  • const sbrad_t theta – [in] 输入角度 θ\theta,以sbrads表示

返回值:

以Q2.30格式表示的指定角度的正弦值。


q2_30 sbrad_tan()

计算指定角度的正切值。

该函数计算 tan(π2θ)tan(\frac{\pi}{2}\theta),并以Q2.30格式返回结果。

输入角度 θ\theta 必须用sbrads表示(参见radians_to_sbrads),并且必须表示为介于±0.25\pm 0.25(包括边界)之间的值(作为Q1.31)。

操作:

tan(π2θ)tan(\frac{\pi}{2}\theta)

参数:

  • const sbrad_t theta – [in] 输入角度 θ\theta,以sbrads表示

返回值:

以Q2.30格式表示的指定角度的正切值。


q2_30 q24_sin()

计算指定角度的正弦值。

该函数计算 sin(θ)sin(\theta),并以Q2.30格式返回结果。

操作:

sin(θ)sin(\theta)

参数:

  • const radian_q24_t theta – [in] 输入角度 θ\theta,以弧度表示(Q8.24)

返回值:

以Q2.30格式表示的 sin(θ)sin(\theta)


q2_30 q24_cos()

计算指定角度的余弦值。

该函数计算 cos(θ)cos(\theta),并以Q2.30格式返回结果。

操作:

cos(θ)cos(\theta)

参数:

  • const radian_q24_t theta – [in] 输入角度 θ\theta,以弧度表示(Q8.24)

返回值:

以Q2.30格式表示的 cos(θ)cos(\theta)


float_s32_t q24_tan()

计算指定角度的正切值。

该函数计算 tan(θ)tan(\theta)。结果以float_s32_t形式返回,其中包含尾数和指数。

θ=π2+kπ\theta=\frac{\pi}{2}+k\pi(其中kk为整数)时,tan(θ)tan(\theta) 的值被视为未定义。如果 θ\theta 满足这个条件,将引发异常。

操作:

tan(θ)tan(\theta)

参数:

  • const radian_q24_t theta – [in] 输入角度 θ\theta,以弧度表示(Q8.24)

返回值:

float_s32_t形式表示的 tan(θ)tan(\theta)

异常:

  • ET_ARITHMETIC 如果 tan(θ)tan(\theta) 未定义,将引发异常。

q2_30 q30_exp_small()

计算接近 00 的Q2.30值的指数函数 exe^x

该函数计算 exe^x,其中 xx 是带有30个小数位的定点值。

该函数使用截断幂级数实现 exe^x,仅适用于范围在 0.5x0.5-0.5 \le x \le 0.5 内的输入。

输出也以Q2.30格式表示。

对于范围 0.5x0.5-0.5 \le x \le 0.5,与math.h中的exp(double)相比,最大观测误差为 2(对应于 2292^{-29})。

对于范围 1.0x1.0-1.0 \le x \le 1.0,相应的最大观测误差为 324,或者近似为 2212^{-21}

要计算 xx 超出 [0.5,0.5]\left[-0.5, 0.5\right] 范围的 exe^x,请使用 float_s32_exp()

操作:

yexy \leftarrow e^x

参数:

  • const q2_30 x – [in] 输入值 xx

返回值:

yy


q8_24 q24_logistic()

计算指定点的逻辑函数值。

该函数计算逻辑函数的值 y=11+exy =\frac{1}{1+e^{-x}}。这是一个在 y=0y = 0 下方和 y=1y = 1 上方有界的S形曲线。

输入 xx 和输出 yy 都是Q8.24定点值。

如果更注重速度而不是精度,则可以使用 q24_logistic_fast()

操作:

y11+exy \leftarrow \frac{1}{1+e^{-x}}

参数:

  • const q8_24 x – [in] 输入值 xx

返回值:

yy


q8_24 q24_logistic_fast()

简介: 在指定点处计算逻辑函数的值。

该函数计算逻辑函数 y=11+exy =\frac{1}{1+e^{-x}} 的值。逻辑函数是一条由 y=0y = 0y=1y = 1 两边界限定的 S 形曲线。

输入 xx 和输出 yy 都是 Q8.24 定点数。

这个实现在精度和速度之间进行权衡,以分段线性的方式近似结果。如果需要精确的结果,应该使用 q24_logistic()

操作:

y11+exy \leftarrow \frac{1}{1+e^{-x}}

参数:

  • const q8_24 x – [out] 输入值 xx

返回值: yy


void s32_to_chunk_s32()

简介: 将整数广播到向量块。

该函数将输入 bb 广播到向量块 aˉ\bar{a} 的 8 个元素中。

操作:

akba_k \leftarrow b

参数:

  • int32_t a[VPU_INT32_EPV] – [out] 输出向量块 aˉ\bar{a}
  • int32_t b – [out] 输入值 bb

异常: 如果 a 不是双字对齐的,则引发 ET_LOAD_STORE 异常(参见 @ref note_vector_alignment)


void q30_powers()

简介: 获取 bb 的前 NN 个幂次

该函数计算 Q2.30 输入 bb 的前 NN 个幂次(从 00 开始)。结果以 Q2.30 格式输出,保存在 aˉ\bar{a} 中。

操作:

a0230=Q30(1.0)a_0 \leftarrow 2^{30} = \mathtt{Q30(1.0)} akround(ak1b230)a_k \leftarrow round\left(\frac{a_{k-1}\cdot b}{2^{30}}\right) 对于 k{0..N1}\qquad\text{对于 }k \in \{0..N-1\}

参数:

  • q2_30 a[] – [out] 输出 aˉ\bar{a}
  • const q2_30 b – [out] 输入 bb
  • const unsigned N – [out] 要计算的 aˉ\bar{a} 的元素个数

void s32_odd_powers()

简介:bb 的奇次幂填充向量。

该函数使用输入 bb 的奇次幂填充输出向量 aˉ\bar{a} 的元素。输出前 count 个奇次幂。最高幂次输出为 2count12\cdot\mathtt{count}-1

每次乘法的 64 位乘积右移 shr 位,并截断为最低的 32 位。如果 bb 是一个带有 shr 位小数的定点数,则每个 aka_k 的 Q 格式与输入 bb 相同。shr 必须是非负数。

该函数不进行舍入或饱和处理。用户需要确保避免溢出。

典型的用例是计算具有奇对称性函数的幂级数。

操作:

bsqr=b22shra0bakak1bsqrshr对于 k{1,2,3,...,count1}\begin{align*} b_{sqr} & = \frac{b^2}{2^{\text{{shr}}}} \\ a_0 & \leftarrow b \\ a_k & \leftarrow \frac{a_{k-1}\,b_{sqr}}{\text{{shr}}} \\ &\text{{对于 }} k \in \{1, 2, 3, ..., \text{{count}} - 1\} \end{align*}

参数:

  • int32_t a[] – [out] 输出向量 aˉ\bar{a}
  • const int32_t b – [out] 输入 bb
  • const unsigned count – [out] 要输出的元素数量。
  • const right_shift_t shr – [out] 64 位乘积右移的位数。