⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dfadd.c

📁 这个linux源代码是很全面的~基本完整了~使用c编译的~由于时间问题我没有亲自测试~但就算用来做参考资料也是非常好的
💻 C
📖 第 1 页 / 共 2 页
字号:
		}	    Dbl_copytoptr(resultp1,resultp2,dstptr);	    return(NOEXCEPTION);	    }	right_exponent = 1;	/* Set exponent to reflect different bias				 * with denomalized numbers. */	}    else	{	Dbl_clear_signexponent_set_hidden(rightp1);	}    Dbl_clear_exponent_set_hidden(leftp1);    diff_exponent = result_exponent - right_exponent;    /*      * Special case alignment of operands that would force alignment      * beyond the extent of the extension.  A further optimization     * could special case this but only reduces the path length for this     * infrequent case.     */    if(diff_exponent > DBL_THRESHOLD)	{	diff_exponent = DBL_THRESHOLD;	}        /* Align right operand by shifting to right */    Dbl_right_align(/*operand*/rightp1,rightp2,/*shifted by*/diff_exponent,    /*and lower to*/extent);    /* Treat sum and difference of the operands separately. */    if( (/*signed*/int) save < 0 )	{	/*	 * Difference of the two operands.  Their can be no overflow.  A	 * borrow can occur out of the hidden bit and force a post	 * normalization phase.	 */	Dbl_subtract_withextension(leftp1,leftp2,/*minus*/rightp1,rightp2,	/*with*/extent,/*into*/resultp1,resultp2);	if(Dbl_iszero_hidden(resultp1))	    {	    /* Handle normalization */	    /* A straight foward algorithm would now shift the result	     * and extension left until the hidden bit becomes one.  Not	     * all of the extension bits need participate in the shift.	     * Only the two most significant bits (round and guard) are	     * needed.  If only a single shift is needed then the guard	     * bit becomes a significant low order bit and the extension	     * must participate in the rounding.  If more than a single 	     * shift is needed, then all bits to the right of the guard 	     * bit are zeros, and the guard bit may or may not be zero. */	    sign_save = Dbl_signextendedsign(resultp1);            Dbl_leftshiftby1_withextent(resultp1,resultp2,extent,resultp1,resultp2);            /* Need to check for a zero result.  The sign and exponent	     * fields have already been zeroed.  The more efficient test	     * of the full object can be used.	     */    	    if(Dbl_iszero(resultp1,resultp2))		/* Must have been "x-x" or "x+(-x)". */		{		if(Is_rounding_mode(ROUNDMINUS)) Dbl_setone_sign(resultp1);		Dbl_copytoptr(resultp1,resultp2,dstptr);		return(NOEXCEPTION);		}	    result_exponent--;	    /* Look to see if normalization is finished. */	    if(Dbl_isone_hidden(resultp1))		{		if(result_exponent==0)		    {		    /* Denormalized, exponent should be zero.  Left operand *		     * was normalized, so extent (guard, round) was zero    */		    goto underflow;		    }		else		    {		    /* No further normalization is needed. */		    Dbl_set_sign(resultp1,/*using*/sign_save);	    	    Ext_leftshiftby1(extent);		    goto round;		    }		}	    /* Check for denormalized, exponent should be zero.  Left    *	     * operand was normalized, so extent (guard, round) was zero */	    if(!(underflowtrap = Is_underflowtrap_enabled()) &&	       result_exponent==0) goto underflow;	    /* Shift extension to complete one bit of normalization and	     * update exponent. */	    Ext_leftshiftby1(extent);	    /* Discover first one bit to determine shift amount.  Use a	     * modified binary search.  We have already shifted the result	     * one position right and still not found a one so the remainder	     * of the extension must be zero and simplifies rounding. */	    /* Scan bytes */	    while(Dbl_iszero_hiddenhigh7mantissa(resultp1))		{		Dbl_leftshiftby8(resultp1,resultp2);		if((result_exponent -= 8) <= 0  && !underflowtrap)		    goto underflow;		}	    /* Now narrow it down to the nibble */	    if(Dbl_iszero_hiddenhigh3mantissa(resultp1))		{		/* The lower nibble contains the normalizing one */		Dbl_leftshiftby4(resultp1,resultp2);		if((result_exponent -= 4) <= 0 && !underflowtrap)		    goto underflow;		}	    /* Select case were first bit is set (already normalized)	     * otherwise select the proper shift. */	    if((jumpsize = Dbl_hiddenhigh3mantissa(resultp1)) > 7)		{		/* Already normalized */		if(result_exponent <= 0) goto underflow;		Dbl_set_sign(resultp1,/*using*/sign_save);		Dbl_set_exponent(resultp1,/*using*/result_exponent);		Dbl_copytoptr(resultp1,resultp2,dstptr);		return(NOEXCEPTION);		}	    Dbl_sethigh4bits(resultp1,/*using*/sign_save);	    switch(jumpsize) 		{		case 1:		    {		    Dbl_leftshiftby3(resultp1,resultp2);		    result_exponent -= 3;		    break;		    }		case 2:		case 3:		    {		    Dbl_leftshiftby2(resultp1,resultp2);		    result_exponent -= 2;		    break;		    }		case 4:		case 5:		case 6:		case 7:		    {		    Dbl_leftshiftby1(resultp1,resultp2);		    result_exponent -= 1;		    break;		    }		}	    if(result_exponent > 0) 		{		Dbl_set_exponent(resultp1,/*using*/result_exponent);		Dbl_copytoptr(resultp1,resultp2,dstptr);		return(NOEXCEPTION); 	/* Sign bit is already set */		}	    /* Fixup potential underflows */	  underflow:	    if(Is_underflowtrap_enabled())		{		Dbl_set_sign(resultp1,sign_save);                Dbl_setwrapped_exponent(resultp1,result_exponent,unfl);		Dbl_copytoptr(resultp1,resultp2,dstptr);		/* inexact = FALSE */		return(UNDERFLOWEXCEPTION);		}	    /* 	     * Since we cannot get an inexact denormalized result,	     * we can now return.	     */	    Dbl_fix_overshift(resultp1,resultp2,(1-result_exponent),extent);	    Dbl_clear_signexponent(resultp1);	    Dbl_set_sign(resultp1,sign_save);	    Dbl_copytoptr(resultp1,resultp2,dstptr);	    return(NOEXCEPTION);	    } /* end if(hidden...)... */	/* Fall through and round */	} /* end if(save < 0)... */    else 	{	/* Add magnitudes */	Dbl_addition(leftp1,leftp2,rightp1,rightp2,/*to*/resultp1,resultp2);	if(Dbl_isone_hiddenoverflow(resultp1))	    {	    /* Prenormalization required. */	    Dbl_rightshiftby1_withextent(resultp2,extent,extent);	    Dbl_arithrightshiftby1(resultp1,resultp2);	    result_exponent++;	    } /* end if hiddenoverflow... */	} /* end else ...add magnitudes... */        /* Round the result.  If the extension is all zeros,then the result is     * exact.  Otherwise round in the correct direction.  No underflow is     * possible. If a postnormalization is necessary, then the mantissa is     * all zeros so no shift is needed. */  round:    if(Ext_isnotzero(extent))	{	inexact = TRUE;	switch(Rounding_mode())	    {	    case ROUNDNEAREST: /* The default. */	    if(Ext_isone_sign(extent))		{		/* at least 1/2 ulp */		if(Ext_isnotzero_lower(extent)  ||		  Dbl_isone_lowmantissap2(resultp2))		    {		    /* either exactly half way and odd or more than 1/2ulp */		    Dbl_increment(resultp1,resultp2);		    }		}	    break;	    case ROUNDPLUS:	    if(Dbl_iszero_sign(resultp1))		{		/* Round up positive results */		Dbl_increment(resultp1,resultp2);		}	    break;	    	    case ROUNDMINUS:	    if(Dbl_isone_sign(resultp1))		{		/* Round down negative results */		Dbl_increment(resultp1,resultp2);		}	    	    case ROUNDZERO:;	    /* truncate is simple */	    } /* end switch... */	if(Dbl_isone_hiddenoverflow(resultp1)) result_exponent++;	}    if(result_exponent == DBL_INFINITY_EXPONENT)        {        /* Overflow */        if(Is_overflowtrap_enabled())	    {	    Dbl_setwrapped_exponent(resultp1,result_exponent,ovfl);	    Dbl_copytoptr(resultp1,resultp2,dstptr);	    if (inexact)		if (Is_inexacttrap_enabled())			return(OVERFLOWEXCEPTION | INEXACTEXCEPTION);		else Set_inexactflag();	    return(OVERFLOWEXCEPTION);	    }        else	    {	    inexact = TRUE;	    Set_overflowflag();	    Dbl_setoverflow(resultp1,resultp2);	    }	}    else Dbl_set_exponent(resultp1,result_exponent);    Dbl_copytoptr(resultp1,resultp2,dstptr);    if(inexact) 	if(Is_inexacttrap_enabled())	    return(INEXACTEXCEPTION);	else Set_inexactflag();    return(NOEXCEPTION);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -