import math


def cdf(x):
    """Calculate approximation of Cumulative Distribution Function by using Hart Algorithms
            
        y = |x|
        
        if y < 7.07106781186547
            N(x) = exp(- y*y / 2) * (A / B)
            
            where
                A = (((((a1*y + a2)*y + a3)*y + a4)*y + a5)*y + a6)*y + a7
                B = ((((((b1*y + b2)*y + b3)*y + b4)*y + b5)*y + b6)*y + b7)*y + b8
            and
                a1 =   0.0352624965998911
                a2 =   0.700383064443688
                a3 =   6.37396220353165
                a4 =  33.912866078383
                a5 = 112.079291497871
                a6 = 221.213596169931
                a7 = 220.206867912376
                b1 =   0.0883883476483184
                b2 =   1.75566716318264
                b3 =  16.064177579207
                b4 =  86.7807322029461
                b5 = 296.564248779674
                b6 = 637.333633378831
                b7 = 793.826512519948
                b8 = 440.413735824752
                  
        if 37 >= y >= 7.07106781186547
            N(x) = exp(- y*y / 2) / (2.506628274631 * C)
            
            where
                C = y + 1 / (y + 2 / (y + 3 / (y + 4 / (y + 0.65))))
                
        if y > 37
            N(x) = 0
        
        When x > 0, N(x) = 1 - N(x)
    """

    y = math.fabs(x)

    if y < 7.07106781186547:
        a = (0.0352624965998911, 0.700383064443688,
             6.37396220353165,   33.912866078383,
             112.079291497871,   221.213596169931,
             220.206867912376
            )
        b = (0.0883883476483184, 1.75566716318264,
             16.064177579207,    86.7807322029461,
             296.564248779674,   637.333633378831,
             793.826512519948,   440.413735824752)

        aa = (((((a[0] * y + a[1]) * y + a[2]) * y + a[3]) * y + a[4]) * y + a[5]) * y + a[6]
        bb = ((((((b[0] * y + b[1]) * y + b[2]) * y + b[3]) * y + b[4]) * y + b[5]) * y + b[6]) * y + b[7]

        n = math.exp(- y * y / 2) * (aa / bb)

    elif 7.07106781186547 <= y <= 37:
        c = y + 1 / (y + 2 / (y + 3 / (y + 4 / (y + 0.65))))
        n = math.exp(- y * y / 2) / (2.506628274631 * c)

    else: # y > 37
        n = 0

    return (1 - n) if x > 0 else n