Advertisement
AmidamaruZXC

Untitled

Oct 25th, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.51 KB | None | 0 0
  1. package root.sqrt;
  2.  
  3. /**
  4.  * @author Victor Kuliamin
  5.  *
  6.  */
  7. public class AdvSqrt extends Sqrt
  8. {
  9.   private static double eps     = 2.25e-16;
  10.   private static long   dgmask  = 0x7FF0000000000000L;
  11.   private static long   mtmask  = 0x000FFFFFFFFFFFFFL;
  12.   private static int    dgshift = 52;
  13.   private static int    sqdgadd = 0x1FF;
  14.   private static double dnrbnd  = Double.longBitsToDouble(0x0010000000000000L);
  15.   private static long   odddeg  = 0x3FF0000000000000L;
  16.   private static long   evndeg  = 0x3FE0000000000000L;
  17.  
  18.   public double sqrt(double x)
  19.   {
  20.     if(Double.isNaN(x) || x < 0) return Double.NaN;
  21.     else if(x == 0 || x == 1 || Double.isInfinite(x)) return x;
  22.     else
  23.     {
  24.       boolean dnr = false;
  25.       if(x < dnrbnd)
  26.       {
  27.         x = x*Math.pow(2, dgshift);
  28.         dnr = true;
  29.       }
  30.      
  31.       long b = Double.doubleToLongBits(x);
  32.       int d = (int)((b & dgmask) >> dgshift);
  33.       double res, tmp;
  34.       int i = 0;
  35.      
  36.       if((d & 1) != 0)
  37.         b = (b & mtmask) | odddeg;
  38.       else
  39.         b = (b & mtmask) | evndeg;
  40.      
  41.       x = Double.longBitsToDouble(b);
  42.       res = x;
  43.      
  44.       while(Math.abs(x-res*res)/x > eps)
  45.       {
  46.         i++;
  47.         tmp = res;
  48.         res = (tmp + x/tmp)/2;
  49.       }
  50.    
  51.       b = Double.doubleToLongBits(res);
  52.       d = (int)Math.ceil((double)d/2)+sqdgadd;
  53.       if(dnr) d -= dgshift/2;
  54.      
  55.       b = (b & mtmask) | ((long)d << dgshift);
  56.       res = Double.longBitsToDouble(b);
  57.       return res;
  58.     }
  59.   }
  60. }
  61.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement