/* *Testforoverflow
*/ if (src_exponent > SGL_FX_MAX_EXP) { /* check for MININT */ if ((src_exponent > SGL_FX_MAX_EXP + 1) ||
Sgl_isnotzero_mantissa(src) || Sgl_iszero_sign(src)) { if (Sgl_iszero_sign(src)) result = 0x7fffffff; else result = 0x80000000;
if (Is_invalidtrap_enabled()) { return(INVALIDEXCEPTION);
}
Set_invalidflag();
*dstptr = result; return(NOEXCEPTION);
}
} /* *Generateresult
*/ if (src_exponent >= 0) {
temp = src;
Sgl_clear_signexponent_set_hidden(temp);
Int_from_sgl_mantissa(temp,src_exponent); if (Sgl_isone_sign(src)) result = -Sgl_all(temp); else result = Sgl_all(temp);
/* check for inexact */ if (Sgl_isinexact_to_fix(src,src_exponent)) {
inexact = TRUE; /* round result */ switch (Rounding_mode()) { case ROUNDPLUS: if (Sgl_iszero_sign(src)) result++; break; case ROUNDMINUS: if (Sgl_isone_sign(src)) result--; break; case ROUNDNEAREST: if (Sgl_isone_roundbit(src,src_exponent)) { if (Sgl_isone_stickybit(src,src_exponent)
|| (Sgl_isone_lowmantissa(temp))) if (Sgl_iszero_sign(src)) result++; else result--;
}
}
}
} else {
result = 0;
/* check for inexact */ if (Sgl_isnotzero_exponentmantissa(src)) {
inexact = TRUE; /* round result */ switch (Rounding_mode()) { case ROUNDPLUS: if (Sgl_iszero_sign(src)) result++; break; case ROUNDMINUS: if (Sgl_isone_sign(src)) result--; break; case ROUNDNEAREST: if (src_exponent == -1) if (Sgl_isnotzero_mantissa(src)) if (Sgl_iszero_sign(src)) result++; else result--;
}
}
}
*dstptr = result; if (inexact) { if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION); else Set_inexactflag();
} return(NOEXCEPTION);
}
/* *Testforoverflow
*/ if (src_exponent > SGL_FX_MAX_EXP) { /* check for MININT */ if (Dbl_isoverflow_to_int(src_exponent,srcp1,srcp2)) { if (Dbl_iszero_sign(srcp1)) result = 0x7fffffff; else result = 0x80000000;
if (Is_invalidtrap_enabled()) { return(INVALIDEXCEPTION);
}
Set_invalidflag();
*dstptr = result; return(NOEXCEPTION);
}
} /* *Generateresult
*/ if (src_exponent >= 0) {
tempp1 = srcp1;
tempp2 = srcp2;
Dbl_clear_signexponent_set_hidden(tempp1);
Int_from_dbl_mantissa(tempp1,tempp2,src_exponent); if (Dbl_isone_sign(srcp1) && (src_exponent <= SGL_FX_MAX_EXP))
result = -Dbl_allp1(tempp1); else result = Dbl_allp1(tempp1);
/* check for inexact */ if (Dbl_isinexact_to_fix(srcp1,srcp2,src_exponent)) {
inexact = TRUE; /* round result */ switch (Rounding_mode()) { case ROUNDPLUS: if (Dbl_iszero_sign(srcp1)) result++; break; case ROUNDMINUS: if (Dbl_isone_sign(srcp1)) result--; break; case ROUNDNEAREST: if (Dbl_isone_roundbit(srcp1,srcp2,src_exponent)) if (Dbl_isone_stickybit(srcp1,srcp2,src_exponent) ||
(Dbl_isone_lowmantissap1(tempp1))) if (Dbl_iszero_sign(srcp1)) result++; else result--;
} /* check for overflow */ if ((Dbl_iszero_sign(srcp1) && result < 0) ||
(Dbl_isone_sign(srcp1) && result > 0)) {
if (Dbl_iszero_sign(srcp1)) result = 0x7fffffff; else result = 0x80000000;
if (Is_invalidtrap_enabled()) { return(INVALIDEXCEPTION);
}
Set_invalidflag();
*dstptr = result; return(NOEXCEPTION);
}
}
} else {
result = 0;
/* check for inexact */ if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
inexact = TRUE; /* round result */ switch (Rounding_mode()) { case ROUNDPLUS: if (Dbl_iszero_sign(srcp1)) result++; break; case ROUNDMINUS: if (Dbl_isone_sign(srcp1)) result--; break; case ROUNDNEAREST: if (src_exponent == -1) if (Dbl_isnotzero_mantissa(srcp1,srcp2)) if (Dbl_iszero_sign(srcp1)) result++; else result--;
}
}
}
*dstptr = result; if (inexact) { if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION); else Set_inexactflag();
} return(NOEXCEPTION);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.