Add sign function bsgn() as a complement to babs().
authorPeter John Acklam <pjacklam@online.no>
Mon, 7 Mar 2011 10:45:38 +0000 (11:45 +0100)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 11 Jun 2011 19:14:25 +0000 (12:14 -0700)
This is the standard mathematical signum function. It sets the
invocand to -1, 0, or 1, if it is real, and NaN otherwise.

Documentation and tests are included.

dist/Math-BigInt/lib/Math/BigInt.pm
dist/Math-BigInt/t/bare_mbi.t
dist/Math-BigInt/t/bigintpm.inc
dist/Math-BigInt/t/bigintpm.t
dist/Math-BigInt/t/sub_mbi.t

index 62c021e..796b75a 100644 (file)
@@ -1013,6 +1013,18 @@ sub babs
   $x;
   }
 
+sub bsgn {
+    # Signum function.
+
+    my $self = shift;
+
+    return $self if $self->modify('bsgn');
+
+    return $self -> bone("+") if $self -> is_pos();
+    return $self -> bone("-") if $self -> is_neg();
+    return $self;               # zero or NaN
+}
+
 sub bneg 
   { 
   # (BINT or num_str) return BINT
@@ -3310,6 +3322,7 @@ Math::BigInt - Arbitrary size integer/float math package
 
   $x->bneg();          # negation
   $x->babs();          # absolute value
+  $x->bsgn();          # sign function (-1, 0, 1, or NaN)
   $x->bnorm();         # normalize (no-op in BigInt)
   $x->bnot();          # two's complement (bit wise not)
   $x->binc();          # increment $x by 1
index d7139dd..9f2198b 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 
 use strict;
-use Test::More tests => 3623;
+use Test::More tests => 3635;
 
 BEGIN { unshift @INC, 't'; }
 
index e52a271..478584b 100644 (file)
@@ -73,7 +73,7 @@ while (<DATA>)
    } elsif ($f eq "bone") {
     $try .= "\$x->bone('$args[1]');";
   # some unary ops
-   } elsif ($f =~ /^b(nan|floor|ceil|sstr|neg|abs|inc|dec|not|sqrt|fac)$/) {
+   } elsif ($f =~ /^b(nan|floor|ceil|sstr|neg|abs|sgn|inc|dec|not|sqrt|fac)$/) {
     $try .= "\$x->$f();";
    } elsif ($f =~ /^(numify|length|stringify|as_hex|as_bin)$/) {
     $try .= "\$x->$f();";
@@ -1222,6 +1222,13 @@ babsNaN:NaN
 -1:1
 +123456789:123456789
 -123456789:123456789
+&bsgn
+NaN:NaN
++inf:1
+-inf:-1
+0:0
++123456789:1
+-123456789:-1
 &bcmp
 bcmpNaN:bcmpNaN:
 bcmpNaN:0:
index cacdb8e..6ee3eff 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 
 use strict;
-use Test::More tests => 3623 + 6;
+use Test::More tests => 3635 + 6;
 
 use Math::BigInt lib => 'Calc';
 
index 668fd19..6a3cecc 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 
 use strict;
-use Test::More tests => 3623
+use Test::More tests => 3635
     + 5;       # +5 own tests
 
 BEGIN { unshift @INC, 't'; }