# HG changeset patch # User John W. Eaton # Date 1349358487 14400 # Node ID ecf5be238b4aa9348d4c87c710b9615c0daed29e # Parent afc002de3ade9673ce32b9d6918f7b0a261965ea provide signbit mapper for real values * mappers.cc (Fsignbit): New function and tests. * ov-base.cc (octave_base_value::get_umap_name): Include signbit in the list. * ov-base.h (octave_base_value::unary_mapper_t): Include umap_xsignbit in the list. * ov-float.cc (octave_float_scalar::map): Handle xsignbit. * ov-scalar.cc (octave_scalar::map): Handle xsignbit. * ov-re-mat.cc (octave_matrix::map): Handle xsignbit. * ov-flt-re-mat.cc (octave_float_matrix::map): Handle xsignbit. * lo-mappers.h (xsignbit): New template function. * arith.txi: Document signbit. diff -r afc002de3ade -r ecf5be238b4a doc/interpreter/arith.txi --- a/doc/interpreter/arith.txi Wed Oct 03 09:41:14 2012 -0700 +++ b/doc/interpreter/arith.txi Thu Oct 04 09:48:07 2012 -0400 @@ -262,6 +262,8 @@ @DOCSTRING(sign) +@DOCSTRING(signbit) + @node Special Functions @section Special Functions diff -r afc002de3ade -r ecf5be238b4a libinterp/corefcn/mappers.cc --- a/libinterp/corefcn/mappers.cc Wed Oct 03 09:41:14 2012 -0700 +++ b/libinterp/corefcn/mappers.cc Thu Oct 04 09:48:07 2012 -0400 @@ -1780,6 +1780,40 @@ %!error sign (1, 2) */ +DEFUNX ("signbit", Fsignbit, args, , + "-*- texinfo -*-\n\ +@deftypefn {Mapping Function} {} signbit (@var{x})\n\ +Return a nonzero value if the value of @var{x} has its sign bit set.\n\ +\n\ +This is not the same as @code{x < 0.0}, because IEEE 754 floating point\n\ +allows zero to be signed. The comparison @code{-0.0 < 0.0} is false,\n\ +but @code{signbit (-0.0)} will return a nonzero value.\n\ +@end deftypefn") +{ + octave_value retval; + if (args.length () == 1) + retval = args(0).xsignbit (); + else + print_usage (); + + return retval; +} + +/* +%!assert (signbit (1) == 0) +%!assert (signbit (-2) != 0) +%!assert (signbit (0) == 0) +%!assert (signbit (-0) != 0) + +%!assert (signbit (single (1)) == 0) +%!assert (signbit (single (-2)) != 0) +%!assert (signbit (single (0)) == 0) +%!assert (signbit (single (-0)) != 0) + +%!error sign () +%!error sign (1, 2) +*/ + DEFUN (sin, args, , "-*- texinfo -*-\n\ @deftypefn {Mapping Function} {} sin (@var{x})\n\ diff -r afc002de3ade -r ecf5be238b4a libinterp/octave-value/ov-base.cc --- a/libinterp/octave-value/ov-base.cc Wed Oct 03 09:41:14 2012 -0700 +++ b/libinterp/octave-value/ov-base.cc Thu Oct 04 09:48:07 2012 -0400 @@ -1229,6 +1229,7 @@ "isspace", "isupper", "isxdigit", + "signbit", "toascii", "tolower", "toupper" diff -r afc002de3ade -r ecf5be238b4a libinterp/octave-value/ov-base.h --- a/libinterp/octave-value/ov-base.h Wed Oct 03 09:41:14 2012 -0700 +++ b/libinterp/octave-value/ov-base.h Thu Oct 04 09:48:07 2012 -0400 @@ -725,6 +725,7 @@ umap_xisspace, umap_xisupper, umap_xisxdigit, + umap_xsignbit, umap_xtoascii, umap_xtolower, umap_xtoupper, diff -r afc002de3ade -r ecf5be238b4a libinterp/octave-value/ov-float.cc --- a/libinterp/octave-value/ov-float.cc Wed Oct 03 09:41:14 2012 -0700 +++ b/libinterp/octave-value/ov-float.cc Thu Oct 04 09:48:07 2012 -0400 @@ -321,6 +321,7 @@ SCALAR_MAPPER (isinf, xisinf); SCALAR_MAPPER (isna, octave_is_NA); SCALAR_MAPPER (isnan, xisnan); + SCALAR_MAPPER (xsignbit, xsignbit); default: return octave_base_value::map (umap); diff -r afc002de3ade -r ecf5be238b4a libinterp/octave-value/ov-flt-re-mat.cc --- a/libinterp/octave-value/ov-flt-re-mat.cc Wed Oct 03 09:41:14 2012 -0700 +++ b/libinterp/octave-value/ov-flt-re-mat.cc Thu Oct 04 09:48:07 2012 -0400 @@ -806,6 +806,7 @@ ARRAY_MAPPER (tan, float, ::tanf); ARRAY_MAPPER (tanh, float, ::tanhf); ARRAY_MAPPER (isna, bool, octave_is_NA); + ARRAY_MAPPER (xsignbit, float, xsignbit); default: return octave_base_value::map (umap); diff -r afc002de3ade -r ecf5be238b4a libinterp/octave-value/ov-re-mat.cc --- a/libinterp/octave-value/ov-re-mat.cc Wed Oct 03 09:41:14 2012 -0700 +++ b/libinterp/octave-value/ov-re-mat.cc Thu Oct 04 09:48:07 2012 -0400 @@ -929,6 +929,7 @@ ARRAY_MAPPER (tan, double, ::tan); ARRAY_MAPPER (tanh, double, ::tanh); ARRAY_MAPPER (isna, bool, octave_is_NA); + ARRAY_MAPPER (xsignbit, double, xsignbit); default: if (umap >= umap_xisalnum && umap <= umap_xtoupper) diff -r afc002de3ade -r ecf5be238b4a libinterp/octave-value/ov-scalar.cc --- a/libinterp/octave-value/ov-scalar.cc Wed Oct 03 09:41:14 2012 -0700 +++ b/libinterp/octave-value/ov-scalar.cc Thu Oct 04 09:48:07 2012 -0400 @@ -337,6 +337,7 @@ SCALAR_MAPPER (isinf, xisinf); SCALAR_MAPPER (isna, octave_is_NA); SCALAR_MAPPER (isnan, xisnan); + SCALAR_MAPPER (xsignbit, xsignbit); default: if (umap >= umap_xisalnum && umap <= umap_xtoupper) diff -r afc002de3ade -r ecf5be238b4a libinterp/octave-value/ov.h --- a/libinterp/octave-value/ov.h Wed Oct 03 09:41:14 2012 -0700 +++ b/libinterp/octave-value/ov.h Thu Oct 04 09:48:07 2012 -0400 @@ -1166,6 +1166,7 @@ MAPPER_FORWARD (xisspace) MAPPER_FORWARD (xisupper) MAPPER_FORWARD (xisxdigit) + MAPPER_FORWARD (xsignbit) MAPPER_FORWARD (xtoascii) MAPPER_FORWARD (xtolower) MAPPER_FORWARD (xtoupper) diff -r afc002de3ade -r ecf5be238b4a liboctave/numeric/lo-mappers.h --- a/liboctave/numeric/lo-mappers.h Wed Oct 03 09:41:14 2012 -0700 +++ b/liboctave/numeric/lo-mappers.h Thu Oct 04 09:48:07 2012 -0400 @@ -401,4 +401,11 @@ return retval; } +template +T +xsignbit (T x) +{ + return signbit (x); +} + #endif