今天翻了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!!!