将 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++ 中,使用 frexp
和 ldexp
函数实际上很容易,在此处记录 (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:无法将字符串转换为浮点数:%”