# 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 --git a/doc/interpreter/arith.txi b/doc/interpreter/arith.txi --- a/doc/interpreter/arith.txi +++ b/doc/interpreter/arith.txi @@ -262,6 +262,8 @@ @DOCSTRING(sign) +@DOCSTRING(signbit) + @node Special Functions @section Special Functions diff --git a/libinterp/corefcn/mappers.cc b/libinterp/corefcn/mappers.cc --- a/libinterp/corefcn/mappers.cc +++ b/libinterp/corefcn/mappers.cc @@ -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 --git a/libinterp/octave-value/ov-base.cc b/libinterp/octave-value/ov-base.cc --- a/libinterp/octave-value/ov-base.cc +++ b/libinterp/octave-value/ov-base.cc @@ -1229,6 +1229,7 @@ "isspace", "isupper", "isxdigit", + "signbit", "toascii", "tolower", "toupper" diff --git a/libinterp/octave-value/ov-base.h b/libinterp/octave-value/ov-base.h --- a/libinterp/octave-value/ov-base.h +++ b/libinterp/octave-value/ov-base.h @@ -725,6 +725,7 @@ umap_xisspace, umap_xisupper, umap_xisxdigit, + umap_xsignbit, umap_xtoascii, umap_xtolower, umap_xtoupper, diff --git a/libinterp/octave-value/ov-float.cc b/libinterp/octave-value/ov-float.cc --- a/libinterp/octave-value/ov-float.cc +++ b/libinterp/octave-value/ov-float.cc @@ -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 --git a/libinterp/octave-value/ov-flt-re-mat.cc b/libinterp/octave-value/ov-flt-re-mat.cc --- a/libinterp/octave-value/ov-flt-re-mat.cc +++ b/libinterp/octave-value/ov-flt-re-mat.cc @@ -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 --git a/libinterp/octave-value/ov-re-mat.cc b/libinterp/octave-value/ov-re-mat.cc --- a/libinterp/octave-value/ov-re-mat.cc +++ b/libinterp/octave-value/ov-re-mat.cc @@ -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 --git a/libinterp/octave-value/ov-scalar.cc b/libinterp/octave-value/ov-scalar.cc --- a/libinterp/octave-value/ov-scalar.cc +++ b/libinterp/octave-value/ov-scalar.cc @@ -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 --git a/libinterp/octave-value/ov.h b/libinterp/octave-value/ov.h --- a/libinterp/octave-value/ov.h +++ b/libinterp/octave-value/ov.h @@ -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 --git a/liboctave/numeric/lo-mappers.h b/liboctave/numeric/lo-mappers.h --- a/liboctave/numeric/lo-mappers.h +++ b/liboctave/numeric/lo-mappers.h @@ -401,4 +401,11 @@ return retval; } +template +T +xsignbit (T x) +{ + return signbit (x); +} + #endif