是否可以将24位整数
值转换为浮点
,然后再转换回24位整数
而不丢失数据?
例如,我们考虑 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 位代表实数 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
,但将答案转换为 Single
对于读者来说这是一个微不足道的练习( extracting mantissa and exponent from double in c# )。
就您而言,您希望将 24 位尾数值存储在 Int32
的低 24 位中。然后使用该链接问题中的代码从 Single
加载并提取它实例。
关于c# - 将 24 位值转换为 float 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25876788/