diff libinterp/corefcn/mappers.cc @ 15487:ecf5be238b4a

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.
author John W. Eaton <jwe@octave.org>
date Thu, 04 Oct 2012 09:48:07 -0400
parents 2fc554ffbc28
children 481417a57a2d
line wrap: on
line diff
--- 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\