我的定点算术实现,性能

时间:2015-05-15 10:58:01

标签: c fixed-point

我在C中实现了一个定点运算,它扩展了通常C类型的格式。

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

我的扩展以这种方式运作

typedef struct fixed_point {
   unsigned long long int chunk[CHUNK_ELEMENT];
} fixed_point;

其中CHUNK_ELEMENT基本上是由宏语句设置的,所以当我编译时,我有我的特定版本的定点东西。

我选择这种实现方式(即将数组体现为结构体),因为更容易实现像

这样的东西
fixed_point sum(fixed_point __x, fixed_point __y);

我的问题是用这种方式实现这些东西是否有效?相反,我可以直接使用数组定义

typedef unsigned long long int[BIT_CHUNK_SIZE] fixed_point

但在这种情况下我应该实现像

这样的东西
void sum(fixed_point* __z, fixed_point __x, fixed_point __y);
从语法的角度来看,这是非常繁琐的。

您怎么看?

(PS。我实现所有基本操作符<<,>>,&,|,^,+, - ,*,/ etc)

1 个答案:

答案 0 :(得分:1)

一件好事是检查一些权威的定点实现做了什么。

以下是在ARM CMSIS数学库中进行定点添加的方法:

    /**
     * @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);

使用:

    typedef int32_t q31_t;  // 32-bit fractional data type in 1.31 format

正如您所看到的,此函数适用于值数组。其他一些定点函数适用于各个值。 CMSIS说(对于正弦函数和处理单个值的函数):

  

“这组函数提供了对正弦,余弦和平方根的快速近似。与CMSIS数学库中的大多数其他函数相比,快速数学函数对单个值而不是数组进行操作。”

相关问题