今天翻了util包,發(fā)現(xiàn)自己對(duì)float的匱乏知識(shí),好在有偉大的wiki百科:
http://en.wikipedia.org/wiki/IEEE_754
很清楚得解釋了IEEE 754規(guī)范
可惜看不懂lucene對(duì)small float的結(jié)構(gòu)定義。
如果按我的理解,似乎類SmallFloat的函數(shù)byteToFloat()和byte315ToFloat()有bug,通過編寫測(cè)試代碼:
SmallFloat.byte315ToFloat(Byte.parseByte("01111000", 2)得到的float值為0.5f,
但按照byte315ToFloat()函數(shù)的說明,"01111000"的mantissaBits尾數(shù)長(zhǎng)度為3, zeroExponent為15,無(wú)負(fù)數(shù),
而01111按IEEE 754規(guī)范,應(yīng)該理解為1,所以01111000表達(dá)的數(shù)值應(yīng)該為1.0×2^0=1,而不是0.5f
非常之tricky。
通過讀byte315ToFloat()函數(shù)實(shí)現(xiàn),發(fā)現(xiàn)"01111000"轉(zhuǎn)換為32位值0,01111110,00000000000000000000000,
該值按IEEE 754規(guī)范的確為0.5f, 其中正負(fù)位為1位,指數(shù)(exponent)位為8位,尾數(shù)(mantissa)位為23位。
而在byteToFloat()和byte315ToFloat()的實(shí)現(xiàn)中,我們可以常看到作者將尾數(shù)位偏移24-mantissa位,
也就是說,他理解的IEEE 754規(guī)范中尾數(shù)位不是23位而是24位。
以上僅為我的猜測(cè),因?yàn)檫€沒有看到byteToFloat()的具體使用環(huán)境。
而且通過測(cè)試代碼,發(fā)現(xiàn)byte和float對(duì)應(yīng)關(guān)系:
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的結(jié)構(gòu),tricky!!!
SmallFloat.byte52ToFloat()和SmallFloat.byte315ToFloat()
的計(jì)算結(jié)果千差萬(wàn)別,
汗,難道lucene是只是把它作為一個(gè)可逆的碼表來(lái)用?
好在通過這個(gè)熟悉了IEEE 754規(guī)范,不算沒所得:) 呵呵