定点数优化提升运算性能

// 将整型转换为定点数,通过将整数左移16位来实现
#define cfixed_from_int(i)      (((cfixed)(i)) << 16)

// 将浮点数转换为定点数,乘以65536.0后转换为cfixed类型
#define cfixed_from_float(x)    ((cfixed)((x) * 65536.0f))

// 将双精度浮点数转换为定点数,乘以65536.0后转换为cfixed类型
#define cfixed_from_double(d)   ((cfixed)((d) * 65536.0))

// 将定点数转换为整型,通过右移16位实现
#define cfixed_to_int(f)        ((f) >> 16)

// 将定点数转换为浮点数,除以65536.0f后转换为float类型
#define cfixed_to_float(x)      ((float)((x) / 65536.0f))

// 将定点数转换为双精度浮点数,除以65536.0后转换为double类型
#define cfixed_to_double(f)     ((double)((f) / 65536.0))

// 定义定点数的1,将整数1左移16位
#define cfixed_const_1          (cfixed_from_int(1))

// 定义定点数的0.5,将cfixed_const_1右移1位
#define cfixed_const_half       (cfixed_const_1 >> 1)

// 定义定点数的e (自然对数的底数),这里有误,应该使用cfixed_from_float(math_e),这里简化成了1
#define cfixed_const_e          ((cfixed)(1))

// 定义定点数的(1 - e),计算1减去自然对数的底数e
#define cfixed_const_1_m_e      (cfixed_const_1 - cfixed_const_e)

// 获取定点数的小数部分,与(1 - e)进行按位与操作
#define cfixed_frac(f)          ((f) & cfixed_const_1_m_e)

// 获取定点数的整数部分,通过将小数部分清零实现
#define cfixed_floor(f)         ((f) & (~cfixed_const_1_m_e))

// 获取定点数的向上取整结果,对f加上0xffff后取整数部分
#define cfixed_ceil(f)          (cfixed_floor((f) + 0xffff))

// 定点数乘法运算,将x转为64位整数与y相乘后再右移16位得到结果
#define cfixed_mul(x, y)        ((cfixed)((((int64_t)(x)) * (y)) >> 16))

// 定点数除法运算,将x转为64位整数左移16位后除以y得到结果
#define cfixed_div(x, y)        ((cfixed)((((int64_t)(x)) << 16) / (y)))

// 定义定点数能表示的最大整数值
#define cfixed_const_max        ((int64_t)0x7fffffff)

// 定义定点数能表示的最小整数值
#define cfixed_const_min        (-((((int64_t)1) << 31)))

// 定义cfixed类型为32位有符号整数
typedef int32_t cfixed;
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值