public static long sqrt(long d) {
    if (isZero(d)) {
      return d;
    } else if (unpackSign(d) || isNaN(d)) {
      return NaN;
    } else if (d == POSITIVE_INFINITY) {
      return d;
    }
    // f is positive, nonzero, and finite    // unpack
    int x = unpackExponent(d);
    long m = unpackMantissa(d);
    // normalize 
    while (m < IMPLIED_ONE) {
      m <<= 1;
      x--;
    }
    // make exponent even
    if ((x & 1) != 0) {
      m <<= 1;
    }
    // compute final exponent
    x = (x >> 1) - 26;
    特别是下面的 完全不懂什么意思 希望得到大家的帮助阿 最好是能取个数给我讲一下~~ 谢谢啦~~
    // generate sqrt(x) bit by bit
    m <<= 1;
    long q = 0L; // q = sqrt(x)
    long s = 0L;
    long r = 0x0020000000000000L;
    while (r != 0) {
      long t = s + r;
      if (t < m) {
        s = t + r;
        m -= t;
        q |= r;
      }
      m <<= 1;
      r >>= 1;
    }
    // round half even
    if (m != 0) {
      q += q & 1L;
    }
    q >>= 1;
    return (((x + 1075L) << 52) | (q & FRACTION_MASK));
  }

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【susan820515】截止到2008-07-10 17:08:22的历史汇总数据(不包括此帖):
    发帖的总数量:0                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:---------------------结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   


    // 特别是下面的 完全不懂什么意思 希望得到大家的帮助阿 最好是能取个数给我讲一下~~ 谢谢啦~~
    // generate sqrt(x) bit by bit
    long m=0;
    m <<= 1; //m = m<<1 右移一位,其实就是m/2
    long q = 0L;
    long s = 0L;
    long r = 0x0020000000000000L;//16进制数
    while (r != 0) {
    long t = s + r;
    if (t < m) {
    s = t + r;
    m -= t;//m=m-t
    q |= r;//q=q|r 位'或'操作
    }
    m <<= 1; //m = m<<1 右移一位,其实就是m/2
    r >>= 1; //r = r>>1 左移一位,其实就是r*2
    }
    // round half even
    if (m != 0) {
    q += q & 1L; //& 是 位 '与'操作
    }
    q >>= 1; //q右移一位 也就是 q = q*2