cmath.py 文件源码

python
阅读 30 收藏 0 点赞 0 评论 0

项目:ouroboros 作者: pybee 项目源码 文件源码
def atanh(x):
    _atanh_special = [
        [complex(-0.0, -pi/2), complex(-0.0, -pi/2), complex(-0.0, -pi/2),
            complex(-0.0, pi/2), complex(-0.0, pi/2), complex(-0.0, pi/2),
            complex(-0.0, float("nan"))],
        [complex(-0.0, -pi/2), None, None, None, None, complex(-0.0, pi/2),
            nan+nanj],
        [complex(-0.0, -pi/2), None, None, None, None, complex(-0.0, pi/2),
            complex(-0.0, float("nan"))],
        [-1j*pi/2, None, None, None, None, 1j*pi/2, nanj],
        [-1j*pi/2, None, None, None, None, 1j*pi/2, nan+nanj],
        [-1j*pi/2, -1j*pi/2, -1j*pi/2, 1j*pi/2, 1j*pi/2, 1j*pi/2,  nanj],
        [-1j*pi/2, nan+nanj, nan+nanj, nan+nanj, nan+nanj, 1j*pi/2, nan+nanj]
    ]

    z = _make_complex(x)

    if not isfinite(z):
        return _atanh_special[_special_type(z.real)][_special_type(z.imag)]

    if z.real < 0:
        return -atanh(-z)

    ay = abs(z.imag)
    if z.real > _SQRT_LARGE_DOUBLE or ay > _SQRT_LARGE_DOUBLE:
        hypot = math.hypot(z.real/2, z.imag/2)
        return complex(z.real/4/hypot/hypot, -math.copysign(pi/2, -z.imag))
    if z.real == 1 and ay < _SQRT_DBL_MIN:
        if ay == 0:
            raise ValueError
        return complex(-math.log(math.sqrt(ay)/math.sqrt(math.hypot(ay, 2))),
                       math.copysign(math.atan2(2, -ay)/2, z.imag))
    return complex(math.log1p(4*z.real/((1-z.real)*(1-z.real) + ay*ay))/4,
                   -math.atan2(-2*z.imag, (1-z.real)*(1+z.real) - ay*ay)/2)
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号