C 我的定点算法实现,性能
我正在用C实现一个定点算法,它扩展了常用C类型的格式 例如。。。您知道C整数类型允许的最大大小是8字节 我的扩展就是这样工作的C 我的定点算法实现,性能,c,fixed-point,C,Fixed Point,我正在用C实现一个定点算法,它扩展了常用C类型的格式 例如。。。您知道C整数类型允许的最大大小是8字节 我的扩展就是这样工作的 typedef struct fixed_point { unsigned long long int chunk[CHUNK_ELEMENT]; } fixed_point; 其中,CHUNK_元素基本上是由一个宏语句设置的,所以当我编译时,我有固定点的特定版本 我选择这种实现方式(即将一个数组合并到一个结构中),因为这样可以更容易地实现 fixed_poin
typedef struct fixed_point {
unsigned long long int chunk[CHUNK_ELEMENT];
} fixed_point;
其中,CHUNK_元素基本上是由一个宏语句设置的,所以当我编译时,我有固定点的特定版本
我选择这种实现方式(即将一个数组合并到一个结构中),因为这样可以更容易地实现
fixed_point sum(fixed_point __x, fixed_point __y);
void sum(fixed_point* __z, fixed_point __x, fixed_point __y);
我的问题是,以这种方式实现这些东西是有效的吗?相反,我可以直接使用数组定义
typedef unsigned long long int[BIT_CHUNK_SIZE] fixed_point
但在这种情况下,我应该实现如下内容
fixed_point sum(fixed_point __x, fixed_point __y);
void sum(fixed_point* __z, fixed_point __x, fixed_point __y);
从语法的角度来看,这是相当乏味的
你觉得怎么样
(顺便说一句,我正在实现所有的基本运算符,&、|、^、+、-、*、/等等)一个好办法是检查一些定点的权威实现所做的工作 以下是如何在ARM数学库中进行定点加法:
/**
* @brief Q31 vector addition.
* @param[in] *pSrcA points to the first input vector
* @param[in] *pSrcB points to the second input vector
* @param[out] *pDst points to the output vector
* @param[in] blockSize number of samples in each vector
* @return none.
*/
void arm_add_q31(
q31_t * pSrcA,
q31_t * pSrcB,
q31_t * pDst,
uint32_t blockSize);
与:
如您所见,此函数可用于值数组。其他一些定点函数处理单个值。CMSIS这样说(对于正弦函数和处理单个值的函数):
这组函数提供正弦、余弦和平方根的快速近似值。与CMSIS数学库中的大多数其他函数相比,快速数学函数对单个值而不是数组进行操作
我发现下划线比这里或那里的几颗星更乏味(以两个下划线开头的标识符的使用是为实现保留的)
\uu*
由实现保留供任何使用;一定要用它来声明你们自己的标识。我真的很难弄清楚定点和这个问题有什么关系。它更像是SIMD风格的块处理。