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;
|