public static Complex log(final Complex value) {
        if (value == null)
            throw new NullPointerException("The value is not properly specified.");
        if (isNaN(value) || isInfinite(value))
            return Complex.NaN;
        if (isOrigin(value))
            return Complex.Infinity;
        double real = Math.abs(value.getModulus() - 1.0) < 0.1 ?
            Math.log1p(value.getModulus() - 1.0) :
            Math.log(value.getModulus());
        return Complex.Cartesian(real, value.getArgument());
    }