code: public static double cos(double x) {
          int quadrant = 0;
  
          /* Take absolute value of the input */
          double xa = x;
          if (x < 0) {
              xa = -xa;
          }
  
          if (xa != xa || xa == Double.POSITIVE_INFINITY) {
              return Double.NaN;
          }
  
          /* Perform any argument reduction */
          double xb = 0;
          if (xa > 3294198.0) {
              // PI * (2**20)
              // Argument too big for CodyWaite reduction.  Must use
              // PayneHanek.
              double reduceResults[] = new double[3];
              reducePayneHanek(xa, reduceResults);
              quadrant = ((int) reduceResults[0]) & 3;
              xa = reduceResults[1];
              xb = reduceResults[2];
          } else if (xa > 1.5707963267948966) {
              final CodyWaite cw = new CodyWaite(xa);
              quadrant = cw.getK() & 3;
              xa = cw.getRemA();
              xb = cw.getRemB();
          }
  
          //if (negative)
          //  quadrant = (quadrant + 2) % 4;
  
          switch (quadrant) {
              case 0:
                  return cosQ(xa, xb);
              case 1:
                  return -sinQ(xa, xb);
              case 2:
                  return -cosQ(xa, xb);
              case 3:
                  return sinQ(xa, xb);
              default:
                  return Double.NaN;
          }
      }
docs: Cosine function.
  
  @param x Argument.
  @return cos(x)