public static double cbrt(double x){
  long inbits=Double.doubleToRawLongBits(x);
  int exponent=(int)((inbits >> 52) & 0x7ff) - 1023;
  boolean subnormal=false;
  if (exponent == -1023) {
    if (x == 0) {
      return x;
    }
    subnormal=true;
    x*=1.8014398509481984E16;
    inbits=Double.doubleToRawLongBits(x);
    exponent=(int)((inbits >> 52) & 0x7ff) - 1023;
  }
  if (exponent == 1024) {
    return x;
  }
  int exp3=exponent / 3;
  double p2=Double.longBitsToDouble((inbits & 0x8000000000000000L) | (long)(((exp3 + 1023) & 0x7ff)) << 52);
  final double mant=Double.longBitsToDouble((inbits & 0x000fffffffffffffL) | 0x3ff0000000000000L);
  double est=-0.010714690733195933;
  est=est * mant + 0.0875862700108075;
  est=est * mant + -0.3058015757857271;
  est=est * mant + 0.7249995199969751;
  est=est * mant + 0.5039018405998233;
  est*=CBRTTWO[exponent % 3 + 2];
  final double xs=x / (p2 * p2 * p2);
  est+=(xs - est * est * est) / (3 * est * est);
  est+=(xs - est * est * est) / (3 * est * est);
  double temp=est * HEX_40000000;
  double ya=est + temp - temp;
  double yb=est - ya;
  double za=ya * ya;
  double zb=ya * yb * 2.0 + yb * yb;
  temp=za * HEX_40000000;
  double temp2=za + temp - temp;
  zb+=za - temp2;
  za=temp2;
  zb=za * yb + ya * zb + zb * yb;
  za*=ya;
  double na=xs - za;
  double nb=-(na - xs + za);
  nb-=zb;
  est+=(na + nb) / (3 * est * est);
  est*=p2;
  if (subnormal) {
    est*=3.814697265625E-6;
  }
  return est;
}

public static double cbrt ( double x ) { long inbits = Double . doubleToRawLongBits ( x ) ; int exponent = ( int ) ( ( inbits > > 52 ) & 0x7ff ) - 1023 ; boolean subnormal = false ; if ( exponent == - 1023 ) { if ( x == 0 ) { return x ; } subnormal = true ; x *= 1.8014398509481984E16 ; inbits = Double . doubleToRawLongBits ( x ) ; exponent = ( int ) ( ( inbits > > 52 ) & 0x7ff ) - 1023 ; } if ( exponent == 1024 ) { return x ; } int exp3 = exponent / 3 ; double p2 = Double . longBitsToDouble ( ( inbits & 0x8000000000000000L ) | ( long ) ( ( ( exp3 + 1023 ) & 0x7ff ) ) << 52 ) ; final double mant = Double . longBitsToDouble ( ( inbits & 0x000fffffffffffffL ) | 0x3ff0000000000000L ) ; double est = - 0.010714690733195933 ; est = est * mant + 0.0875862700108075 ; est = est * mant + - 0.3058015757857271 ; est = est * mant + 0.7249995199969751 ; est = est * mant + 0.5039018405998233 ; est *= CBRTTWO [ exponent % 3 + 2 ] ; final double xs = x / ( p2 * p2 * p2 ) ; est += ( xs - est * est * est ) / ( 3 * est * est ) ; est += ( xs - est * est * est ) / ( 3 * est * est ) ; double temp = est * HEX_40000000 ; double ya = est + temp - temp ; double yb = est - ya ; double za = ya * ya ; double zb = ya * yb * 2.0 + yb * yb ; temp = za * HEX_40000000 ; double temp2 = za + temp - temp ; zb += za - temp2 ; za = temp2 ; zb = za * yb + ya * zb + zb * yb ; za *= ya ; double na = xs - za ; double nb = - ( na - xs + za ) ; nb -= zb ; est += ( na + nb ) / ( 3 * est * est ) ; est *= p2 ; if ( subnormal ) { est *= 3.814697265625E-6 ; } return est ; }
compute the cubic root of a number .
