高空间利用率的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更慢。

你可能感兴趣的:(高空间利用率的Tagged Pointer的浮点数表示)