可以将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位呢?
答案 0 :(得分:1)
在考虑了你的问题之后,我现在明白了你的问题。
我知道你有24位代表一个实数n
,而-1 <= n <= +1
就是System.Single
,你想把它加载到frexp
的实例中,然后重新加载。
在C / C ++中,使用ldexp
和System.Double
函数实际上很容易,这里记录(how can I extract the mantissa of a double),但在.NET中它是一个更复杂的过程。
C#语言规范(以及.NET)声明它使用IEEE-754 1989格式,这意味着您需要将这些位转储为整数类型,以便您可以执行按位逻辑来提取组件。除了System.Single
而不是Single
之外,此问题已在此处提出,但将答案转换为与Int32
一起使用对读者而言是一项微不足道的练习(extracting mantissa and exponent from double in c#)
在您的情况下,您希望将24位尾数值存储在Single
的低24位中,然后使用该链接问题中的代码加载并从中提取它{{1}}实例。
答案 1 :(得分:1)
[-16777216,16777216]范围内的每个整数都可以完全表示为IEEE 754 32位二进制浮点数。这包括无符号和2的补码24位整数范围。简单的铸造将完成这项工作。
范围比您预期的要宽,因为存在一个未存储的额外有效位 - 它是一个已知不为零的二进制数字。