【问题标题】:How to store 10 bit float value in C [closed]如何在 C 中存储 10 位浮点值 [关闭]
【发布时间】:2018-01-04 11:46:57
【问题描述】:

我有一个雷达设备。来自设备的各种数据,如检测到的物体速度、加速度距离等。但数据为 10 位和 13 位浮点值。如何打印该 10 位和 13 位浮点值以及如何存储该值?作为具有 32 位值的浮点数。我试图将它直接存储在浮点变量中,但它给出了错误的值。

【问题讨论】:

  • 您必须了解更多关于表示的信息,而不仅仅是总位数。
  • 您能否更具体地说明需要什么:精确表示等...
  • 您需要提供更多信息。例如更完整的数据格式描述、数据表链接、您尝试过的内容等。
  • 如果您只想存储这个,uint16_t(或uint8_t[2],如果字节序是一个问题)可以解决问题。如果您需要 (位的解释),您需要更多信息,例如指数的宽度、有效数、它们的位置、符号位的位置等。
  • 一旦你知道这些,使用ldexp

标签: c visual-studio floating-point precision type-conversion


【解决方案1】:

对于 10 位的情况,输入包括: 第 15 位:符号 位 10-14:指数(指数 =(位 10-14)+ 15) 位 0-9:重要(1.(位 0-9))

这样的东西应该可以工作,尽管请注意我还没有测试过:

int halfFloatToInt16(unsigned int input, int shift)
{

    int exp, output;

    // Load precision: (1.(precision bits 0-9))
    output  = (int)(0x03FF & input);
    output += 0x0400;

    // Apply sign (bit 15)
    output  = (0x8000 & input)?(-output):output;

    // Calculate exponent (bits 10 - 14)
    // Adjustment -25 = -15 for exponent and -10 for significand
    exp  = (int)((0x001F) & (input >> 10));
    exp -= 25;

    // Apply shift to acheive desired fixed point precision
    exp += shift;

    // Shift output
    if(exp > 0)
    {
        return(output << exp);
    }
    else
    {
        return(output >> exp);
    }
}

这里的输入将是 16 位浮点值,如上所述,转换为无符号整数。班次标识已应用于输出的班次。因此,函数的输出将是值乘以 shift 指定的幂的两倍。例如,如果预期的最大输出值为 1,您将使用 14 的移位。因此 16384 表示 1。如果输出的最大期望值为 20000,则将移位设为零。这将优化输出的整体精度。

【讨论】:

  • 我什至不知道有这种类型存在:)
  • 好吧,我假设它是一个半精度数:en.wikipedia.org/wiki/Half-precision_floating-point_format
  • 10位类型怎么会有15位?你假设一个 float16 的意思,但这不是问题提到的。
  • C 实际上并没有与 16 位浮点数相关联的数据类型,因此没有真正的定义。为了清楚起见,我会修正措辞。
  • @JonathonS。在我的情况下,不同参数的最大期望值分别为 1138.2、204.8、127.75。那么该参数的移位值是多少。能给我公式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多