如何将TEDS的ConRes及ConRelRes类型转换为C语言double类型?
TEDS中ConRes与ConRelRes类型转C语言double的实现方法
一、ConRes(恒定分辨率,线性映射)解码
ConRes是基于线性映射的压缩格式,将编码后的整数映射回[min_val, max_val]区间的浮点值。
核心逻辑:
- 计算区间总范围:
range = max_val - min_val - 计算编码的总步数:总步数为
2^bit_count - 1(编码值从0到2^bit_count - 1) - 计算每步对应的浮点增量:
step = range / (总步数) - 解码值 = 最小值 + 编码值 × 步长
C语言实现代码:
#include <stdint.h> #include <math.h> double decode_conres(uint32_t encoded_val, double min_val, double max_val, int bit_count) { if (bit_count <= 0 || min_val >= max_val) { return NAN; // 非法参数返回NaN } uint64_t total_steps = (uint64_t)1 << bit_count; total_steps -= 1; // 总步数为2^bit_count - 1 double step = (max_val - min_val) / (double)total_steps; return min_val + (double)encoded_val * step; }
二、ConRelRes(恒定相对分辨率,对数映射)解码
ConRelRes是基于对数映射的压缩格式,适合动态范围极大的数值场景,能保证相对分辨率一致。注意:该格式要求min_val和max_val必须为正数(对数函数定义域限制)。
核心逻辑:
- 计算最大值与最小值的比值:
ratio = max_val / min_val - 计算该比值的自然对数:
log_ratio = ln(ratio) - 将编码值归一化到
[0, 1]区间:norm = encoded_val / (2^bit_count - 1) - 解码值 = 最小值 × e^(归一化值 × 对数比值)
C语言实现代码:
#include <stdint.h> #include <math.h> double decode_conrelres(uint32_t encoded_val, double min_val, double max_val, int bit_count) { if (bit_count <= 0 || min_val <= 0 || max_val <= 0 || min_val >= max_val) { return NAN; // 非法参数返回NaN } uint64_t total_steps = (uint64_t)1 << bit_count; total_steps -= 1; double norm = (double)encoded_val / (double)total_steps; double log_ratio = log(max_val / min_val); return min_val * exp(norm * log_ratio); }
注意事项
- 编码位数
bit_count超过31位时,必须用64位整数计算总步数,避免溢出(代码中已用uint64_t处理) - 若ConRelRes涉及负数区间,通常会先做偏移将数值转为正数后再映射,解码时反向偏移,具体需参考对应TEDS文档定义
- 实际使用中可根据需求替换自然对数/指数为常用对数(
log10/pow(10, ...)),但需保证编码和解码的对数底一致
内容的提问来源于stack exchange,提问作者Max Kielland
相关产品推荐
相关产品推荐

