高空間利用率的Tagged Pointer的浮點數表示

1. IEEE754 的雙精度浮點數定義

最高位: 符號
中11位:指數,當它全部位爲1時標識無窮大 android EditText使用指南
低52位:小數

無窮大有2^53個!實際使用時只須要正無窮和負無窮,多出的2^53-2個無窮大提供了不少空間,只須要利用其中的一小部分,就能同時表示指針、整數、還有好多其它東西。

一個雙精度浮點數的二進制表示,以64位整數加法加上 2^48 後,
若最高16位爲0x0000,那它原來最高16位全1,因此全部指數位都是1,也是無窮大
若最高16位爲0x1111,那它原來最高15位全1,因此全部指數位都是1,也是無窮大

2. 有效地址 > FFFF 8000 0000 0000 或者 < 0000 7FFFF FFFF FFFF
以64位整數加法加上 2^48 後,高16位全0

3. webkit 的 js 引擎中,0x0000 區分給指針,0x1111 區分給整數。

Pointer {  0000:PPPP:PPPP:PPPP
          / 0001:****:****:****
Double  {         ...
          \ FFFE:****:****:****
Integer {  FFFF:0000:IIII:IIII


相關
商帳追收 Java簡單類型有裝箱和拆箱的區分,增長了編程複雜度和某些狀況的內存消耗,但實現中能夠不用tagged pointer表示原生類型。 Ruby MRI的全部對象都是用tagged pointer表示的。 對於整數,ruby代碼不用區分裝箱來仍是拆箱,運算結果只要是31位之內能夠表示的,就用Fixnum,  不然採用裝箱的Bignum,因此整數和指針都能很好的表示並且不會損失精度。YARV特別優化了整數運算效率,速度甚至能夠和haskell比一下。 可是MRI的浮點數表示老是裝箱類型,致使浮點數值計算的處理效率很是低(有時能夠比C慢100倍以上), rubinius也暫時沒進行優化,至少如今(rubinius1.24)對浮點數的處理比YARV更慢。
相關文章
相關標籤/搜索