三角法如何使用二进制角度?
假设我的360°或2pi角度从0变为给定无符号整数类型的最大值,如何用这种表示来计算sin和所有其他函数?
什么是通用算法?
修改
我的观点是删除任何浮点计算或浮点类型,我想用无符号整数来实现它。
答案 0 :(得分:1)
我将假设你的无符号类型最多为UINT_MAX
,你的意思是360°代表两个UINTMAX + 1
的力量。
在这种情况下,它非常简单:使用标准三角函数sinpi()
,当应用于x
时,计算sin(πx)。
32位unsigned int
的一个例子:
sinpi((double)n * 0x1.0p-31)
请注意,转换为double
和乘法都是精确的,这意味着最终结果与sinpi()
一样准确。您可以在CRlibm内找到最准确的双精度sinpi
。
答案 1 :(得分:1)
我曾经基于CORDIC算法实现了这一点。对于二进制角度,算法很简单。
让n位二进制角和向量[cos(x),sin(x)]初始化为x = 0.对于每个位,从MSB到LSB,只需应用{{3的一部分的旋转(或pi)。旋转矩阵可以预先计算。该算法最多花费4次加法和2次乘法,乘以二进制角度设置的位数。
然而!真正的问题是,你如何表示你的sin(x)和cos(x)的结果值。它们可以是固定点或浮点数......主要问题是有效地实现它们的加法和乘法。