code: public static double atanh(double a) {
          boolean negative = false;
          if (a < 0) {
              negative = true;
              a = -a;
          }
  
          double absAtanh;
          if (a > 0.15) {
              absAtanh = 0.5 * Math.log((1 + a) / (1 - a));
          } else {
              final double a2 = a * a;
              if (a > 0.087) {
                  absAtanh = a * (1 + a2 * (F_1_3 + a2 * (F_1_5 + a2 * (F_1_7 + a2 * (F_1_9 + a2 * (F_1_11 + a2 * (F_1_13 + a2 * (F_1_15 + a2 * F_1_17))))))));
              } else if (a > 0.031) {
                  absAtanh = a * (1 + a2 * (F_1_3 + a2 * (F_1_5 + a2 * (F_1_7 + a2 * (F_1_9 + a2 * (F_1_11 + a2 * F_1_13))))));
              } else if (a > 0.003) {
                  absAtanh = a * (1 + a2 * (F_1_3 + a2 * (F_1_5 + a2 * (F_1_7 + a2 * F_1_9))));
              } else {
                  absAtanh = a * (1 + a2 * (F_1_3 + a2 * F_1_5));
              }
          }
  
          return negative ? -absAtanh : absAtanh;
      }
docs: Compute the inverse hyperbolic tangent of a number.
  @param a number on which evaluation is done
  @return inverse hyperbolic tangent of a