2014-04-02 34 views
0

我有一个单精度浮点值,并且没有关于生成此值的样本分布的信息,所以我无法应用sigmoid或执行某种正常化。另外,我知道价值永远是非负面的。将这个float表示为一个字节的最好方法是什么?将浮点数量化为字节的最佳方法

我想到了以下几点:

解释浮动的UInt32的(我预计这将维持数的相对顺序,请纠正我,如果我错了),然后将其扩展到范围一个字节。

UInt32 uVal = BitConverter.ToUInt32(BitConverter.GetBytes(fVal), 0); 
byte bVal = Convert.ToByte(uVal * Byte.MaxValue/UInt32.MaxValue); 

我会感谢您的意见和任何其他建议。谢谢!

+0

为什么不使用'Single.MaxValue'而不是'UInt32.MaxValue'? – dasblinkenlight

+1

这可能会奏效,但我有点担心浮动指数。 –

+0

@dasblinkenlight我预计大部分数字都会很小 - 大概不会超过10个。所以我很担心,如果我直接用Single.MaxValue进行分割,我总是会把它量化为0. – Sau

回答

0

你必须假设一个分配。你没有选择。不知何故,你必须分割浮点值并将它们分配给字节值。

如果分布假定为线性算术,则空间大致为0到3.4e38。字节值中的每个增量将具有大约+ 1.3e36的权重。

如果分布假定为线性几何,那么空间大致为2.3e83。字节值中的每个增量将具有约x2.1的权重。

您可以通过简单的算术推导出这些值。第一个是maxfloat/256。第二个是(maxfloat/minfloat)的第256个根。

您对使用和缩放原始位模式的建议将产生一种整体分布,其中具有不同指数的数字被分组在一起,而具有相同指数和不同尾数的数字被分开。我不会为大多数目的推荐它。

- 这可能适合某些目的

一个非常简单的方法就是使用8位指数(屏蔽0x7f80),忽略符号位和尾数。 00和ff的值必须专门处理。请参阅http://en.wikipedia.org/wiki/Single-precision_floating-point_format

+0

啊 - 谢谢你。我想我是以不正确的方式解释位模式。这也意味着简单地将float解释为uint不会保持数字排序。 – Sau

+0

@Sau:它很接近,但它是大部分工作的指数。请参阅编辑。 –

相关问题