# atan2
四象限反正切
函数库:TyFixedPoint
# 语法
z = atan2(y,x)
# 说明
z = atan2(y,x) 返回 fi 输入 y 和 x 的四象限反正切。
# 示例
计算定点输入值的反正切
使用该函数计算无符号和有符号定点输入值的反正切。
无符号输入值
此示例使用无符号的 16 位字长值。
using TyFixedPoint
y = fi(0.125,0,16);
x = fi(0.5,0,16);
z = atan2(y,x)
0.244964599609375
DataTypeMode: Fixed_point_binary_point_scaling
Signedness: Unsigned
WordLength: 16
FractionLength: 15
有符号输入值
此示例使用有符号的 16 位字长值。
y = fi(-0.1,1,16);
x = fi(-0.9,1,16);
z = atan2(y,x)
-3.0308837890625
DataTypeMode: Fixed_point_binary_point_scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
# 输入参数
y — Y 坐标标量 | 矢量 | 矩阵 | 多维数组
y 坐标,指定为标量、向量、 矩阵或多维数组。
y 和 x 可以是实值的、有符号的或 无符号标量、向量、矩阵或多维数组,包含以弧度为单位的固定点角值。输入维度大小必须相同。
数据类型: fi
复数支持: 否
x — X 坐标标量 | 矢量 | 矩阵 | 多维数组
x 坐标,指定为标量、向量、 矩阵或多维数组。
y 和 x 可以是实值的、有符号的或 无符号标量、向量、矩阵或多维数组,包含以弧度为单位的固定点角值。输入维度大小必须相同。
数据类型: fi
复数支持: 否
# 输出参数
z — 四象限反正切标量 | 矢量 | 矩阵 | 多维数组
四象限反正切,以标量、向量、矩阵或多维形式返回。
z 是 y 和 x 的四象限反正切函数。z 的取值依赖于 y 和 x 的符号情况和数值类型:
- 如果 y 或 x 中任意一个是有符号的,则 z 是一个有符号的定点数,其取值范围在 [-π, π] 之间。它具有 16 位的字长和 13 位的小数长度(即数值类型为 (1, 16, 13));
- 如果 y 和 x 都是无符号的,则 z 是一个无符号的定点数,其取值范围在 [0, π/2] 之间。它具有 16 位的字长和 15 位的小数长度(即数值类型为 (0, 16, 15))。
输出 z 总是与默认的 fimath 相关联。
数据类型: fi
# 算法
atan2 使用一个 8 位查找表来计算定点输入的四象限反正切(atan2)值,具体计算方法如下:
首先,将输入值的绝对值进行除法运算,得到一个无符号的、分数形式的、16 位定点比率,该比率的值介于 0 到 1 之间。y 和 x 的绝对值决定了哪个值作为除数。
y 和 x 的正负号决定了它们比率所在的象限。绝对值较大的输入值被用作分母,从而产生一个介于 0 到 1 之间的值。
在进行反正切计算时,输入值的正负号对于确定结果所在的象限至关重要。通过比较 y 和 x 的绝对值,我们可以确定哪个值作为分母,进而计算出它们比率的正负和大小。
这种计算方法可以确保我们得到正确的象限信息,从而得到准确的反正切值。根据存储的 16 位无符号整数值,计算查找表索引的方法如下:
- 使用 8 位最高有效位来从查找表中获取第一个值;
- 使用下一个更大的查找表值作为第二个值。
使用 8 位最低有效位,通过最近邻线性插值方法在第一个和第二个值之间进行插值。这种插值方法产生一个值,其范围在 [0, π/4) 之间。
根据原始的 y 和 x 输入值,对得到的角值进行八分位校正。