/* *Generatemantissa
*/ if (Sgl_isnotzero_exponent(opnd1)) { /* set hidden bit */
Sgl_clear_signexponent_set_hidden(opnd1);
} else { /* check for zero */ if (Sgl_iszero_mantissa(opnd1)) {
Sgl_setzero_exponentmantissa(result);
*dstptr = result; return(NOEXCEPTION);
} /* is denormalized, adjust exponent */
Sgl_clear_signexponent(opnd1);
Sgl_leftshiftby1(opnd1);
Sgl_normalize(opnd1,dest_exponent);
} /* opnd2 needs to have hidden bit set with msb in hidden bit */ if (Sgl_isnotzero_exponent(opnd2)) {
Sgl_clear_signexponent_set_hidden(opnd2);
} else { /* check for zero */ if (Sgl_iszero_mantissa(opnd2)) {
Sgl_setzero_exponentmantissa(result);
*dstptr = result; return(NOEXCEPTION);
} /* is denormalized; want to normalize */
Sgl_clear_signexponent(opnd2);
Sgl_leftshiftby1(opnd2);
Sgl_normalize(opnd2,dest_exponent);
}
/* Multiply two source mantissas together */
Sgl_leftshiftby4(opnd2); /* make room for guard bits */
Sgl_setzero(opnd3); /* *Fourbitsatatimeareinspectedineachloop,anda *simpleshiftandaddmultiplyalgorithmisused.
*/ for (count=1;count<SGL_P;count+=4) {
stickybit |= Slow4(opnd3);
Sgl_rightshiftby4(opnd3); if (Sbit28(opnd1)) Sall(opnd3) += (Sall(opnd2) << 3); if (Sbit29(opnd1)) Sall(opnd3) += (Sall(opnd2) << 2); if (Sbit30(opnd1)) Sall(opnd3) += (Sall(opnd2) << 1); if (Sbit31(opnd1)) Sall(opnd3) += Sall(opnd2);
Sgl_rightshiftby4(opnd1);
} /* make sure result is left-justified */ if (Sgl_iszero_sign(opnd3)) {
Sgl_leftshiftby1(opnd3);
} else { /* result mantissa >= 2. */
dest_exponent++;
} /* check for denormalized result */ while (Sgl_iszero_sign(opnd3)) {
Sgl_leftshiftby1(opnd3);
dest_exponent--;
} /* *checkforguard,stickyandinexactbits
*/
stickybit |= Sgl_all(opnd3) << (SGL_BITLENGTH - SGL_EXP_LENGTH + 1);
guardbit = Sbit24(opnd3);
inexact = guardbit | stickybit;
/* re-align mantissa */
Sgl_rightshiftby8(opnd3);
/* *roundresult
*/ if (inexact && (dest_exponent>0 || Is_underflowtrap_enabled())) {
Sgl_clear_signexponent(opnd3); switch (Rounding_mode()) { case ROUNDPLUS: if (Sgl_iszero_sign(result))
Sgl_increment(opnd3); break; case ROUNDMINUS: if (Sgl_isone_sign(result))
Sgl_increment(opnd3); break; case ROUNDNEAREST: if (guardbit) { if (stickybit || Sgl_isone_lowmantissa(opnd3))
Sgl_increment(opnd3);
}
} if (Sgl_isone_hidden(opnd3)) dest_exponent++;
}
Sgl_set_mantissa(result,opnd3);
/* *Testforoverflow
*/ if (dest_exponent >= SGL_INFINITY_EXPONENT) { /* trap if OVERFLOWTRAP enabled */ if (Is_overflowtrap_enabled()) { /* *Adjustbiasofresult
*/
Sgl_setwrapped_exponent(result,dest_exponent,ovfl);
*dstptr = result; if (inexact) if (Is_inexacttrap_enabled()) return(OVERFLOWEXCEPTION | INEXACTEXCEPTION); else Set_inexactflag(); return(OVERFLOWEXCEPTION);
}
inexact = TRUE;
Set_overflowflag(); /* set result to infinity or largest number */
Sgl_setoverflow(result);
} /* *Testforunderflow
*/ elseif (dest_exponent <= 0) { /* trap if UNDERFLOWTRAP enabled */ if (Is_underflowtrap_enabled()) { /* *Adjustbiasofresult
*/
Sgl_setwrapped_exponent(result,dest_exponent,unfl);
*dstptr = result; if (inexact) if (Is_inexacttrap_enabled()) return(UNDERFLOWEXCEPTION | INEXACTEXCEPTION); else Set_inexactflag(); return(UNDERFLOWEXCEPTION);
}
/* Determine if should set underflow flag */
is_tiny = TRUE; if (dest_exponent == 0 && inexact) { switch (Rounding_mode()) { case ROUNDPLUS: if (Sgl_iszero_sign(result)) {
Sgl_increment(opnd3); if (Sgl_isone_hiddenoverflow(opnd3))
is_tiny = FALSE;
Sgl_decrement(opnd3);
} break; case ROUNDMINUS: if (Sgl_isone_sign(result)) {
Sgl_increment(opnd3); if (Sgl_isone_hiddenoverflow(opnd3))
is_tiny = FALSE;
Sgl_decrement(opnd3);
} break; case ROUNDNEAREST: if (guardbit && (stickybit ||
Sgl_isone_lowmantissa(opnd3))) {
Sgl_increment(opnd3); if (Sgl_isone_hiddenoverflow(opnd3))
is_tiny = FALSE;
Sgl_decrement(opnd3);
} break;
}
}
/* return zero or smallest number */ if (inexact) { switch (Rounding_mode()) { case ROUNDPLUS: if (Sgl_iszero_sign(result)) {
Sgl_increment(opnd3);
} break; case ROUNDMINUS: if (Sgl_isone_sign(result)) {
Sgl_increment(opnd3);
} break; case ROUNDNEAREST: if (guardbit && (stickybit ||
Sgl_isone_lowmantissa(opnd3))) {
Sgl_increment(opnd3);
} break;
} if (is_tiny) Set_underflowflag();
}
Sgl_set_exponentmantissa(result,opnd3);
} else Sgl_set_exponent(result,dest_exponent);
*dstptr = result;
/* check for inexact */ if (inexact) { if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION); else Set_inexactflag();
} return(NOEXCEPTION);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-09-29)
¤
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.