将 24 位值转换为浮点数并返回

Posted

技术标签:

【中文标题】将 24 位值转换为浮点数并返回【英文标题】:Convert 24 bit value to float and back 【发布时间】:2014-09-16 19:21:05 【问题描述】:

是否可以将24 bit integer 值转换为float,然后再转换回24 bit integer 而不会丢失数据?

例如,让我们考虑 8 位 int,一个字节,范围是 [-127..127](我们去掉 -128)。

public static float ToFloatSample (byte x)  return x / 127f; 

所以,如果x == -127,结果将为-1,如果x == 127,结果将为1。如果x == 64,结果将是~0.5

public static int ToIntSample (float x)  return (int) (x * 127f); 

那么现在:

int x = some_number;
float f = ToFloatSample (x);
int y = ToIntSample (f);

会一直x == y 吗?使用 8 位 int 是的,但如果我使用 24 位呢?

【问题讨论】:

源变量的类型是什么? “24 位值”没有任何意义。 表示该值有 2^24 个可能的值。例如 0..2^24 - 1. 为什么不在 Int32 中?看起来更合适。 【参考方案1】:

考虑过你的问题,我现在明白你在问什么了。

我知道您有 24 位表示一个实数 n,例如 -1 <= n <= +1,您希望将其加载到 System.Single 的实例中,然后再返回。

在 C/C++ 中,使用 frexpldexp 函数实际上很容易,在此处记录 (how can I extract the mantissa of a double),但在 .NET 中,这是一个更复杂的过程。

C# 语言规范(因此,.NET)声明它使用 IEEE-754 1989 格式,这意味着您需要将位转储为整数类型,以便您可以执行按位逻辑来提取组件。除了System.Double 而不是System.Single 之外,这个问题已经在SO 上提出过,但是将答案转换为使用Single 对读者来说是一个简单的练习(extracting mantissa and exponent from double in c#)。

在您的情况下,您希望将 24 位尾数值存储在 Int32 的低 24 位中,然后使用该链接问题中的代码从 Single 实例中加载和提取它.

【讨论】:

【参考方案2】:

[-16777216, 16777216] 范围内的每个整数都可以精确地表示为 IEEE 754 32 位二进制浮点数。这包括无符号和 2 的补码 24 位整数范围。简单的铸造就可以了。

范围比您预期的要宽,因为有一个额外的有效位未存储 - 它是一个已知不为零的二进制数字。

【讨论】:

OP 说他想存储-1+1 之间的数字,而不是整数。在他的情况下,铸造不起作用。

以上是关于将 24 位值转换为浮点数并返回的主要内容,如果未能解决你的问题,请参考以下文章

图像数据无法转换为浮点数错误?

Python“ValueError:无法将字符串转换为浮点数:%”

将字节转换为浮点数?

Sklearn Pipeline ValueError:无法将字符串转换为浮点数

组合四个字节并转换为浮点数

Pyspark 数据框将多列转换为浮点数