package jmathlib.toolbox.general;
import jmathlib.core.functions.ExternalElementWiseFunction;
import jmathlib.core.tokens.numbertokens.DoubleNumberToken;
import jmathlib.toolbox.jmathlib.matrix.abs;
/**External function to calculate sign of a number
for a matrix it returns a matrix of equal size
for a complex number x sign = x/abs x
*/
public class sign extends ExternalElementWiseFunction
{
/**Calculate the sign
@param operands[0] = value to calculate sign of
@return a matrix of the same size as the operands*/
public double[] evaluateValue(double[] arg)
{
double[] result = new double[2];
if (arg[IMAG]==0)
{
if (arg[REAL]>0)
{
result[REAL] = 1.0;
}
else if (arg[REAL]<0)
{
result[REAL] = -1.0;
}
else
result[IMAG] = 0;
}
else
{
// for complex number sign is determined
// like sign(X) = X./abs(X)
abs absFunc = new abs();
DoubleNumberToken num = new DoubleNumberToken();
result = absFunc.evaluateValue(arg);
result = num.divide(arg, result);
}
return result;
}
}
/*
@GROUP
general
@SYNTAX
sign(value)
@DOC
Returns the sign of value.
@EXAMPLES
<programlisting>
sign(-10) = -1
sign(10) = 1
sign(3+2i) = 0.832 + 0.555i
</programlisting>
@NOTES
The sign of a complex number is calculated as sign(x) = x./abs(x)
@SEE
abs
*/
/*
%!@testcase
%! ml.executeExpression("a=sign(11);");
%! assertTrue(1 == ml.getScalarValueRe("a"));
%! assertTrue(0 == ml.getScalarValueIm("a"));
%!
%!@testcase
%! ml.executeExpression("a=sign(-12);");
%! assertTrue(-1 == ml.getScalarValueRe("a"));
%! assertTrue(0 == ml.getScalarValueIm("a"));
%!
%!@testcase
%! ml.executeExpression("a=sign(0);");
%! assertTrue(0 == ml.getScalarValueRe("a"));
%! assertTrue(0 == ml.getScalarValueIm("a"));
%!
%!
%!@testcase
%! ml.executeExpression("a=sign(8i);");
%! assertTrue(0 == ml.getScalarValueRe("a"));
%! assertTrue(1 == ml.getScalarValueIm("a"));
%!
%!@testcase
%! ml.executeExpression("a=sign(-5i);");
%! assertTrue(0 == ml.getScalarValueRe("a"));
%! assertTrue(-1 == ml.getScalarValueIm("a"));
%!
%!@testcase
%! ml.executeExpression("a=sign(0i);");
%! assertTrue(0 == ml.getScalarValueRe("a"));
%! assertTrue(0 == ml.getScalarValueIm("a"));
%!
*/