将24位值转换为float和back

时间:2014-09-16 19:21:06

标签: c# floating-point

可以将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位呢?

2 个答案:

答案 0 :(得分:1)

在考虑了你的问题之后,我现在明白了你的问题。

我知道你有24位代表一个实数n,而-1 <= n <= +1就是System.Single,你想把它加载到frexp的实例中,然后重新加载。

在C / C ++中,使用ldexpSystem.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位整数范围。简单的铸造将完成这项工作。

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