On Fri, 30 Nov 2001, Nicholas Clark wrote:
> On Fri, Nov 30, 2001 at 12:04:13AM +0000, Simon Cozens wrote:
> > On Thu, Nov 29, 2001 at 04:50:24PM -0500, James Mastros wrote:
> > > Why?  For at least x86, your way will be a lot slower.
> >
> > Maybe I should try to find out why Perl 5 does it like that before making
> > such pronouncements. :)
> >
> > Nick, any idea why Perl's abs doesn't use abs?

> 2: abs() does integers, fabs() does doubles. I think they're both ANSI C89.
>    but are labs(), llabs(), and for floating point fabsl() and fabsf()?
>    [now that our IVs and NVs can be long longs and long doubles.
>     and if labs() isn't C89 we can't even safely do IV is long]
>

I think it makes sense to do what simon says, as this way the size of
FLOATVAL and INTVAL can be bigger than double/long and everything will still
work without any changes.

Patch the second attached.

Alex Gough
-- 
All progress is initiated by challenging current conceptions,
and executed by supplanting existing institutions.
? classes/perlint.c
? classes/perlstring.c
? classes/perlnum.c
Index: core.ops
===================================================================
RCS file: /home/perlcvs/parrot/core.ops,v
retrieving revision 1.33
diff -u -r1.33 core.ops
--- core.ops    2001/11/29 04:25:02     1.33
+++ core.ops    2001/11/30 01:11:31
@@ -739,6 +739,32 @@
 
 ########################################
 
+=item B<abs>(i|n, i|ic|n|nc)
+
+Set $1 to absolute value of $2.
+
+=cut
+
+AUTO_OP abs(i, i|ic|n|nc) {
+  if ($2 < 0) {
+    $1 = - (INTVAL)$2;
+  }
+  else {
+    $1 = (INTVAL)$2;
+  }
+}
+
+AUTO_OP abs(n, n|nc|i|ic) {
+  if ($2 < 0) {
+    $1 = - (FLOATVAL)$2;
+  }
+  else {
+    $1 = $2;
+  }
+}
+
+########################################
+
 =item B<cmod>(i, i, i)
 
 =item B<cmod>(i, i, ic)
Index: t/op/integer.t
===================================================================
RCS file: /home/perlcvs/parrot/t/op/integer.t,v
retrieving revision 1.13
diff -u -r1.13 integer.t
--- t/op/integer.t      2001/10/14 00:43:50     1.13
+++ t/op/integer.t      2001/11/30 01:11:31
@@ -1,6 +1,6 @@
 #! perl -w
 
-use Parrot::Test tests => 27;
+use Parrot::Test tests => 28;
 
 output_is(<<CODE, <<OUTPUT, "set_i_ic");
        # XXX: Need a test for writing outside the set of available
@@ -169,6 +169,25 @@
 574908040
 862362060
 1724724120
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "abs(i, i|ic)");
+       set     I0, 1
+       abs     I1, -1
+       abs     I0, I0
+       set     I2, -1
+       abs     I2, I2
+       print   I0
+       print   "\n"    
+       print   I1
+       print   "\n"    
+       print   I2
+       print   "\n"    
+       end
+CODE
+1
+1
+1
 OUTPUT
 
 output_is(<<CODE, <<OUTPUT, "sub_i");
Index: t/op/number.t
===================================================================
RCS file: /home/perlcvs/parrot/t/op/number.t,v
retrieving revision 1.9
diff -u -r1.9 number.t
--- t/op/number.t       2001/10/14 00:43:50     1.9
+++ t/op/number.t       2001/11/30 01:11:32
@@ -1,6 +1,6 @@
 #! perl -w
 
-use Parrot::Test tests => 27;
+use Parrot::Test tests => 28;
 
 output_is(<<CODE, <<OUTPUT, "set_n_nc");
        set     N0, 1.0
@@ -151,6 +151,29 @@
         end
 CODE
 420042.000000
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "abs(n, i|ic|n|nc)");
+       set     I0, -1
+       abs     N0, I0
+       abs     N1, -1
+       set     N2, -1
+       abs     N2, N2
+       abs     N3, -1.0
+       print N0
+       print "\n"
+       print N1
+       print "\n"
+       print N2
+       print "\n"
+       print N3
+       print "\n"
+       end
+CODE
+1.000000
+1.000000
+1.000000
+1.000000
 OUTPUT
 
 output_is(<<CODE, <<OUTPUT, "mul_i");

Reply via email to