面向单片机的无浮点运算高精度整数范围映射C语言实现方案咨询
面向单片机的无浮点运算高精度整数范围映射C语言实现方案咨询
嘿,我最近在给单片机写固件(这次用的是Microchip PIC,但希望方案能通用到任意品牌的单片机),碰到了整数范围映射的精度问题,想请教下有没有更专业的实现方式。
大家应该都见过Arduino的map函数,就是这个:
long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
但网上很多人说它精度很差,原因是没用到浮点运算——我数学水平一般,就暂时信了这个说法😂。我不想用开销大的浮点运算,之前自己试了个土方法:如果是uint8_t的输入,先转成uint16_t,乘10或者100这类因子,再做类似上面的映射,模拟1到2位定点小数来提升精度,效果好像还凑合,但总觉得这个办法既幼稚又低效,肯定有更聪明的实现。
我把具体需求列出来,麻烦大家帮忙看看:
- 必须用纯C语言实现(绝对不能用C++!)
- 支持
uint8_t和uint16_t类型的处理:可以是两个独立的函数版本,毕竟C没有模板 - 能将同类型的非负整数从任意输入范围映射到同类型的任意输出范围,要求完全精确
- 全程禁止使用
float或double数据类型 - 代码体积和RAM占用必须极小:我当前用的芯片只有2048字节的程序存储空间和512字节RAM,函数的开销最好控制在10%以内,越少越好
- 计算效率要达标:假设单片机每秒能执行100万条汇编指令,整个映射计算的耗时不能超过1/20秒(也就是5万条指令以内)
举个具体的测试例子:
uint8_t input = 162; uint8_t in_min = 12, in_max = 233, out_min = 5, out_max = 199; uint8_t output = map_uint8(input, in_min, in_max, out_min, out_max); // 要求输出必须精确等于137
想问问各位大佬,有没有符合这些要求的更优实现方案?麻烦不吝赐教!
内容来源于stack exchange
相关产品推荐
相关产品推荐

