非整数数字二进制表示

时间:2014-11-23 22:56:09

标签: java binary floating-point bit-manipulation

java中浮点数的二进制表示如何? 例如,(5.34)的二进制表示是什么。

感谢。

2 个答案:

答案 0 :(得分:0)

https://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#longBitsToDouble(long)

  

如果参数为0x7ff0000000000000L,则结果为正无穷大。

     

如果参数为0xfff0000000000000L,则结果为负无穷大。

     

如果参数是0x7ff0000000000001L到0x7fffffffffffffffL范围内的任何值或0xfff0000000000001L到0xffffffffffffffffL范围内的任何值,则结果为NaN。 Java提供的IEEE 754浮点运算不能区分具有不同位模式的相同类型的两个NaN值。 NaN的不同值只能通过使用Double.doubleToRawLongBits方法来区分。

     

在所有其他情况下,让s,e和m为可以从参数计算的三个值:

int s = ((bits >> 63) == 0) ? 1 : -1;
int e = (int)((bits >> 52) & 0x7ffL);
long m = (e == 0) ?
             (bits & 0xfffffffffffffL) << 1 :
             (bits & 0xfffffffffffffL) | 0x10000000000000L;
  

然后浮点结果等于数学表达式s·m·2 e-1075 的值。

转换可以反过来完成。对于“正常”数字x,让s为值的符号,e为floor(log2(x))+ 1075,m从x / 2 e ,并适当地移动值:s是高位,e是接下来的11位,m是剩余的52位。

答案 1 :(得分:0)

在外行人看来,浮点数用2的幂表示。每个浮点都有三个部分。

  • 签署
  • 指数
  • 尾数

签名部分很简单。它具有负面和正面价值。您的浮点值大致使用尾数表示,而exponent用于缩放它。有关示例,请参阅following site。您的5.34值低于。请注意,它是近似值,如下所示,您的数字不是5.34而是5.340000152587891。

enter image description here