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 * FastMath.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;
	}