Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我的定点算法实现,性能_C_Fixed Point - Fatal编程技术网

C 我的定点算法实现,性能

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

我正在用C实现一个定点算法,它扩展了常用C类型的格式

例如。。。您知道C整数类型允许的最大大小是8字节

我的扩展就是这样工作的

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风格的块处理。