高空间利用率的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更慢。
相关文章
相关标签/搜索