今天翻了util包,发现自己对float的匮乏知识,好在有伟大的wiki百科:
http://en.wikipedia.org/wiki/IEEE_754
很清楚得解释了IEEE 754规范

可惜看不懂lucene对small float的结构定义。
如果按我的理解,似乎类SmallFloat的函数byteToFloat()和byte315ToFloat()有bug,通过编写测试代码:
SmallFloat.byte315ToFloat(Byte.parseByte("01111000", 2)得到的float值为0.5f,

但按照byte315ToFloat()函数的说明,"01111000"的mantissaBits尾数长度为3, zeroExponent为15,无负数,
而01111按IEEE 754规范,应该理解为1,所以01111000表达的数值应该为1.0×2^0=1,而不是0.5f
非常之tricky。

通过读byte315ToFloat()函数实现,发现"01111000"转换为32位值0,01111110,00000000000000000000000,
该值按IEEE 754规范的确为0.5f, 其中正负位为1位,指数(exponent)位为8位,尾数(mantissa)位为23位。

而在byteToFloat()和byte315ToFloat()的实现中,我们可以常看到作者将尾数位偏移24-mantissa位,
也就是说,他理解的IEEE 754规范中尾数位不是23位而是24位。

以上仅为我的猜测,因为还没有看到byteToFloat()的具体使用环境。

而且通过测试代码,发现byte和float对应关系:
10000,000==2.0f= 1*2^1
10001,000==8.0f=1*2^3
10010,000==32.0f=1*2^5
01111,000 = 0.5f = 1*2^-1
01110,000==0.125f= 1* 2^-3
完全看不出合理的small float的结构,tricky!!!