📄 mathadv.c
字号:
LwIn = L_shl(L_Input, siShiftCnt);
siShiftCnt = add(siShiftCnt, 1);
siShiftCnt = negate(siShiftCnt);
/* calculate x*x*c0 */
/* ---------------- */
swIn = extract_h(LwIn);
swInSqrd = mult_r(swIn, swIn);
LwIn = L_mult(swInSqrd, swC0);
/* add x*c1 */
/* --------- */
LwIn = L_mac(LwIn, swIn, swC1);
/* add c2 */
/* ------ */
LwIn = L_add(LwIn, L_deposit_h(swC2));
/* apply *(4/32) */
/* ------------- */
LwIn = L_shr(LwIn, 3);
LwIn = LwIn & 0x03ffffff;
siShiftCnt = shl(siShiftCnt, 10);
LwIn = L_add(LwIn, L_deposit_h(siShiftCnt));
/* return log2 */
/* ----------- */
return (LwIn);
}
/***************************************************************************
*
* FUNCTION NAME: fnLog
*
* PURPOSE:
* The purpose of this function is to take the natural log of input and
* divide by 32 and return; i.e. output = log(input)/32
*
* INPUTS:
*
* L_Input
* input
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* Longword
* output
*
* DESCRIPTION:
*
* log(x) = log(2) * log2(x)
* = 0.693147 * log2(x)
*
* log2(x) = 4.0 * (-.3372223*x*x + .9981958*x -.6626105)
* c0 c1 c2 (includes sign)
*
*************************************************************************/
Longword fnLog(Longword L_Input)
{
static Shortword
Scale = 22713; /* 0.693147 = log(2) */
Longword LwIn;
/*_________________________________________________________________________
| |
| Executable Code |
|_________________________________________________________________________|
*/
/* 0.693147*log2(x) */
/* ---------------- */
LwIn = fnLog2(L_Input);
LwIn = L_mpy_ls(LwIn, Scale);
return (LwIn);
}
/***************************************************************************
*
* FUNCTION NAME: fnLog10
*
* PURPOSE:
* The purpose of this function is to take the log base 10 of input and
* divide by 32 and return; i.e. output = log10(input)/32
*
* INPUTS:
*
* L_Input
* input
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* Longword
* output
*
* DESCRIPTION:
*
* log10(x) = log10(2) * log2(x)
* = 0.30103 * log2(x)
*
* log2(x) = 4.0 * (-.3372223*x*x + .9981958*x -.6626105)
* c0 c1 c2 (includes sign)
*
*************************************************************************/
Longword fnLog10(Longword L_Input)
{
static Shortword
Scale = 9864; /* 0.30103 = log10(2) */
Longword LwIn;
/*_________________________________________________________________________
| |
| Executable Code |
|_________________________________________________________________________|
*/
/* 0.30103*log2(x) */
/* ------------------- */
LwIn = fnLog2(L_Input);
LwIn = L_mpy_ls(LwIn, Scale);
return (LwIn);
}
/***************************************************************************
*
* FUNCTION NAME: fnExp2
*
* PURPOSE:
* The purpose of this function is to implement a base two exponential
* 2**(32*x) by polynomial approximation
*
*
* INPUTS:
*
* L_Input
* unnormalized input exponent (input range constrained
* to be < 0)
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* LwIn
* exponential output
*
* DESCRIPTION:
*
* polynomial approximation is used for the generation of the exponential
*
* 2**(32*X) = 0.1713425*X*X + 0.6674432*X + 0.9979554
* c2 c1 c0
*
*************************************************************************/
Longword fnExp2(Longword L_Input)
{
/*_________________________________________________________________________
| |
| Local Static Variables |
|_________________________________________________________________________|
*/
static Shortword pswPCoefE[3] =
{ /* c2, c1, c0 */
0x15ef, 0x556f, 0x7fbd
};
/*_________________________________________________________________________
| |
| Automatic Variables |
|_________________________________________________________________________|
*/
Shortword swTemp1, swTemp2, swTemp3, swTemp4;
Longword LwIn;
/*_________________________________________________________________________
| |
| Executable Code |
|_________________________________________________________________________|
*/
/* initialize */
/* ---------- */
swTemp3 = 0x0020;
/* determine normlization shift count */
/* ---------------------------------- */
swTemp1 = extract_h(L_Input);
LwIn = L_mult(swTemp1, swTemp3);
swTemp2 = extract_h(LwIn);
/* determine un-normalized shift count */
/* ----------------------------------- */
swTemp3 = -0x0001;
swTemp4 = sub(swTemp3, swTemp2);
/* normalize input */
/* --------------- */
LwIn = LwIn & 0xffff;
LwIn = L_add(LwIn, L_deposit_h(swTemp3));
LwIn = L_shr(LwIn, 1);
swTemp1 = extract_l(LwIn);
/* calculate x*x*c2 */
/* ---------------- */
swTemp2 = mult_r(swTemp1, swTemp1);
LwIn = L_mult(swTemp2, pswPCoefE[0]);
/* calculate x*x*c2 + x*c1 */
/* ----------------------- */
LwIn = L_mac(LwIn, swTemp1, pswPCoefE[1]);
/* calculate x*x*c2 + x*c1 + c0 */
/* --------------------------- */
LwIn = L_add(LwIn, L_deposit_h(pswPCoefE[2]));
/* un-normalize exponent if its requires it */
/* ---------------------------------------- */
if (swTemp4 > 0)
{
LwIn = L_shr(LwIn, swTemp4);
}
/* return result */
/* ------------- */
return (LwIn);
}
/***************************************************************************
*
* FUNCTION NAME: fnExp10
*
* PURPOSE:
* The purpose of this function is to implement a base ten exponential
* 10**(32*x) by polynomial approximation
*
*
* INPUTS:
*
* L_Input
* unnormalized input exponent (input range constrained
* to be < 0)
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* LwIn
* exponential output
*
* DESCRIPTION:
*
* polynomial approximation is used for the generation of the exponential
*
* 10**(32*X) = 2**((32*X) / log10(2))
* = 2**((32*X) / 0.30103)
*
* 2**(32*X) = 0.1713425*X*X + 0.6674432*X + 0.9979554
* c2 c1 c0
*
*************************************************************************/
Longword fnExp10(Longword L_Input)
{
/*_________________________________________________________________________
| |
| Local Static Variables |
|_________________________________________________________________________|
*/
static Shortword
InvScale = 27213; /* (1/log10(2))/4 */
/*_________________________________________________________________________
| |
| Automatic Variables |
|_________________________________________________________________________|
*/
Longword LwIn;
/*_________________________________________________________________________
| |
| Executable Code |
|_________________________________________________________________________|
*/
LwIn = L_mpy_ls(L_Input, InvScale);
LwIn = L_shl(LwIn, 2);
LwIn = fnExp2(LwIn);
/* return result */
/* ------------- */
return (LwIn);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -