You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将TEDS的ConRes及ConRelRes类型转换为C语言double类型?

TEDS中ConRes与ConRelRes类型转C语言double的实现方法

一、ConRes(恒定分辨率,线性映射)解码

ConRes是基于线性映射的压缩格式,将编码后的整数映射回[min_val, max_val]区间的浮点值。

核心逻辑:

  1. 计算区间总范围:range = max_val - min_val
  2. 计算编码的总步数:总步数为2^bit_count - 1(编码值从0到2^bit_count - 1)
  3. 计算每步对应的浮点增量:step = range / (总步数)
  4. 解码值 = 最小值 + 编码值 × 步长

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必须为正数(对数函数定义域限制)。

核心逻辑:

  1. 计算最大值与最小值的比值:ratio = max_val / min_val
  2. 计算该比值的自然对数:log_ratio = ln(ratio)
  3. 将编码值归一化到[0, 1]区间:norm = encoded_val / (2^bit_count - 1)
  4. 解码值 = 最小值 × 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:00:03