Listing 3: The new version of fp::operator *=

fp& fp::operator *= (const fp& f)
    {    // multiply this fp object by f
    fp f1 = ARG(*this);
    fp f2 = ARG(f);
    if (IS_NAN(f1))
        *this = f1;
    else if (IS_NAN(f2))
        *this = f2;
    else if (IS_INF(f1) && IS_ZERO(f2) || 
             IS_ZERO(f1) && IS_INF(f2))
        *this = exception(inv, f1);
    else if (IS_ZERO(f1) || IS_ZERO(f2))
        *this = f1.is_neg == f2.is_neg ? zero : nzero;
    else if (IS_INF(f1) || IS_INF(f2))
        *this = f1.is_neg == f2.is_neg ? pinf : ninf;
    else
        normalize(f1.exp + f2.exp - BIAS, f1.lf() * f2.lf());
    return *this;    
    }