我在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)
答案 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数学库中的大多数其他函数相比,快速数学函数对单个值而不是数组进行操作。”