From: Jorge G. <cl...@us...> - 2007-05-27 01:34:14
|
Update of /cvsroot/easycalc/easycalc/mlib In directory sc8-pr-cvs17:/tmp/cvs-serv8888/mlib Modified Files: complex.c mathem.c Log Message: complex support for rounding and truncation functions (ROUND, TRUNC, CEIL, FLOOR) Index: complex.c =================================================================== RCS file: /cvsroot/easycalc/easycalc/mlib/complex.c,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** complex.c 17 Sep 2006 11:46:06 -0000 1.22 --- complex.c 27 May 2007 01:34:09 -0000 1.23 *************** *** 726,732 **** result = cplx_atanh(carg); break; ! default: ! return c_badfunc; } --- 726,748 ---- result = cplx_atanh(carg); break; ! case MATH_FLOOR: ! case MATH_CEIL: ! res=carg.real; ! stack_add_val(stack,&res,real); ! if ((err=math_math(func,stack))) ! return err; ! if ((err=stack_get_val(stack,&res,real))) ! return err; ! result.real=res; ! res=carg.imag; ! stack_add_val(stack,&res,real); ! if ((err=math_math(func,stack))) ! return err; ! if ((err=stack_get_val(stack,&res,real))) ! return err; ! result.imag=res; ! break; default: ! return c_badarg; } *************** *** 745,746 **** --- 761,811 ---- return err; } + + /*********************************************************************** + * + * FUNCTION: cplx_round + * + * DESCRIPTION: Compute round or trunc on complex numbers + * + * PARAMETERS: On stack 1 or 2 arguments + * (first - complex number ; second - no. of decimal points) + * + * RETURN: On stack 1 complex result + * + ***********************************************************************/ + CError + cplx_round(Functype *func,CodeStack *stack) + { + Complex carg; + double arg,precision; + CError err; + + if(func->paramcount == 2) + if ((err=stack_get_val(stack,&precision,real))) + return err; + if ((err=stack_get_val(stack,&carg,complex))) + return err; + + arg=carg.real; + stack_add_val(stack,&arg,real); + if(func->paramcount == 2) + stack_add_val(stack,&precision,real); + if ((err=math_round(func,stack))) + return err; + if ((err=stack_get_val(stack,&arg,real))) + return err; + carg.real=arg; + + arg=carg.imag; + stack_add_val(stack,&arg,real); + if(func->paramcount == 2) + stack_add_val(stack,&precision,real); + if ((err=math_round(func,stack))) + return err; + if ((err=stack_get_val(stack,&arg,real))) + return err; + carg.imag=arg; + + err=stack_add_val(stack,&carg,complex); + return err; + } \ No newline at end of file Index: mathem.c =================================================================== RCS file: /cvsroot/easycalc/easycalc/mlib/mathem.c,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -d -r1.35 -r1.36 *** mathem.c 10 Oct 2006 00:58:36 -0000 1.35 --- mathem.c 27 May 2007 01:34:09 -0000 1.36 *************** *** 754,760 **** /* complex is defined for these operations */ ! if ((func->num==MATH_ABS || func->num==MATH_EXP || func->num==MATH_SQRT || func->num==MATH_LN || func->num==MATH_LOG || ! func->num==MATH_LOG2) && type==complex) return cplx_math(func,stack); --- 754,761 ---- /* complex is defined for these operations */ ! if (/*(func->num==MATH_ABS || func->num==MATH_EXP || func->num==MATH_SQRT || func->num==MATH_LN || func->num==MATH_LOG || ! func->num==MATH_LOG2|| func->num==MATH_FLOOR || ! func->num==MATH_CEIL) &&*/ type==complex) return cplx_math(func,stack); *************** *** 876,879 **** --- 877,881 ---- double arg; CError err; + rpntype type; if (func->paramcount == 2) { *************** *** 886,889 **** --- 888,901 ---- return c_badargcount; + err = stack_item_type(stack,&type,0); + if (err) + return err; + + if (type==complex){ + if(func->paramcount == 2) + stack_add_val(stack,&precision,real); + return cplx_round(func,stack); + } + if ((err=stack_get_val(stack,&arg,real))) return err; |