From: Leopold Toetsch <[EMAIL PROTECTED]> Date: Sun, 1 May 2005 11:18:47 +0200
Bob Rogers <[EMAIL PROTECTED]> wrote: > I have started writing a t/op/n_arithmetics.t test, based directly on > t/op/arithmetics.t. Great, thanks. No problem. See attached. It should cover everything that is covered in arithmetics.t that makes sense for the n_* ops. Is there anything missing? > ... But I notice that if I try > P0 = n_add P0, 1 > I get the error: Accidentally converted to an inplace operation. Is fixed here already. I'll committ it RSN. I notice this case works now, so it's covered; thanks. From: Leopold Toetsch <[EMAIL PROTECTED]> Date: Sun, 01 May 2005 10:51:27 +0200 Bob Rogers wrote: > Also, I notice that n_ceil and n_floor are not implemented. Should > they be? floor, ceil is currently implemented for native types only. As long as we don't have PMC variants, we don't have n_ceil and n_floor either. OK; I wasn't paying attention, it seems. I don't know, if we need PMC variants and vtable functions. The semantics of floor and ceil are pretty close to the metal anyway, so I'm not sure what PMC versions would buy, other than convenience. I'll assume the decision is therefore "no" -- until decided otherwise, of course. ;-} -- Bob Rogers http://rgrjr.dyndns.org/
#! perl -w # Copyright: 2001-2003 The Perl Foundation. All Rights Reserved. # $Id: arithmetics.t 7810 2005-04-12 10:09:05Z leo $ =head1 NAME t/op/n_arithmetics.t - n_* Arithmetic Ops =head1 SYNOPSIS % perl -Ilib t/op/n_arithmetics.t =head1 DESCRIPTION Tests basic arithmetic ops that construct a new return value on various combinations of Parrot integer and number types. =cut use Parrot::Test tests => 17; use Test::More; ### ### Operations on a single INTVAL ### pir_output_is(<<'CODE', <<OUTPUT, "take the negative of an Integer"); .sub _main @MAIN P0 = new Integer ## negate zero. set P0, 0 n_neg P1, P0 print P1 print "\n" P30 = P1 ## negate a positive number. set P0, 1234567890 n_neg P1, P0 print P1 print "\n" ## check that we are not reusing P1. ne_addr P30, P1, not_broken print "Broken!\n" not_broken: ## negate a negative number. set P0, -1234567890 P1 = n_neg P0 print P1 print "\n" .end CODE 0 -1234567890 1234567890 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "take the absolute value of an Integer"); .sub _main @MAIN P0 = new Integer ## find absolute zero (so to speak). set P0, 0 P1 = n_abs P0 print P1 print "\n" P30 = P1 ## find the absolute value of a positive Integer. set P0, 1234567890 n_abs P1, P0 print P1 print "\n" ## check that we are not reusing P1. ne_addr P30, P1, not_broken print "Broken!\n" not_broken: ## find the absolute value of a negative number. set P0, -1234567890 n_abs P1, P0 print P1 print "\n" .end CODE 0 1234567890 1234567890 OUTPUT ### ### first arg is Integer, second arg is Integer ### pir_output_is(<<'CODE', <<OUTPUT, "add Integer to Integer"); .sub _main @MAIN P0 = new Integer set P0, 4000 P1 = new Integer set P1, -123 P2 = new Integer set P2, 666 n_add P2, P0, P1 print P2 print "\n" P30 = P2 P2 = n_add P0, P1 print P2 print "\n" ## check that we are not reusing P2. ne_addr P30, P2, not_broken print "Broken!\n" not_broken: ## check adding constants. P2 = n_add P0, 11 print P2 print "\n" P0 = n_add P0, 11 print P0 print "\n" .end CODE 3877 3877 4011 4011 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "subtract Integer from Integer"); .sub _main @MAIN P0 = new Integer set P0, 4000 P1 = new Integer set P1, -123 P2 = new Integer set P2, 666 n_sub P2, P0, P1 print P2 print "\n" P30 = P2 P2 = n_sub P0, P1 print P2 print "\n" ## check that we are not reusing P2. ne_addr P30, P2, not_broken print "Broken!\n" not_broken: ## check subtracting constants. P2 = n_sub P0, 11 print P2 print "\n" P0 = n_sub P0, 11 print P0 print "\n" .end CODE 4123 4123 3989 3989 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "multiply Integer with Integer"); .sub _main @MAIN P0 = new Integer set P0, 4000 P1 = new Integer set P1, -123 P2 = new Integer set P2, 666 n_mul P2, P0, P1 print P2 print "\n" P3 = n_mul P0, P1 print P3 print "\n" ## check multiplying constants. P2 = n_mul P0, 11 print P2 print "\n" P0 = n_mul P0, 11 print P0 print "\n" .end CODE -492000 -492000 44000 44000 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "divide Integer by Integer"); .sub _main @MAIN P0 = new Integer set P0, 4000 P1 = new Integer set P1, -123 P2 = new Integer set P2, 666 n_div P2, P0, P1 print P2 print "\n" P3 = n_div P0, P1 print P3 print "\n" ## check dividing by constants. P2 = n_div P0, 11 print P2 print "\n" P0 = n_div P0, 11 print P0 print "\n" .end CODE -32.5203 -32.5203 363.636 363.636 OUTPUT ### ### Operations on a single NUMVAL ### pir_output_is(<<'CODE', <<OUTPUT, "negate a Float"); .sub _main @MAIN P0 = new Float set P0, 0 P1 = n_neg P0 print P1 print "\n" set P0, -0.0 n_neg P1, P0 print P1 print "\n" set P0, 123.4567890 P1 = n_neg P0 print P1 print "\n" set P0, -123.4567890 n_neg P1, P0 print P1 print "\n" .end CODE 0 0 -123.457 123.457 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "take the absolute value of a Float"); .sub _main @MAIN P0 = new Integer set P0, 0 P1 = n_abs P0 print P1 print "\n" set P0, -0.0 n_abs P1, P0 print P1 print "\n" set P0, 123.45678901 n_abs P1, P0 print P1 print "\n" set P0, -123.45678901 P1 = n_abs P0 print P1 print "\n" .end CODE 0 0 123.457 123.457 OUTPUT ### ### FLOATVAL and INTVAL tests ### pir_output_is(<<'CODE', <<OUTPUT, "add Integer to Float"); .sub _main @MAIN P10 = new Integer set P10, 4000 P0 = new Float set P0, -123.123 n_add P1, P0, P10 print P1 print "\n" P30 = P1 P1 = n_add P0, P10 print P1 print "\n" ## check that we are not reusing P1. ne_addr P30, P1, not_broken print "Broken!\n" not_broken: P2 = n_add P10, P0 print P2 print "\n" P1 = n_add P1, P10 print P1 print "\n" .end CODE 3876.88 3876.88 3876.88 7876.88 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "subtract Integer from Float"); .sub _main @MAIN P10 = new Integer set P10, 4000 P0 = new Float set P0, -123.123 n_sub P1, P0, P10 print P1 print "\n" P30 = P1 P1 = n_sub P0, P10 print P1 print "\n" ## check that we are not reusing P1. ne_addr P30, P1, not_broken print "Broken!\n" not_broken: P2 = n_sub P10, P0 print P2 print "\n" P1 = n_sub P1, P10 print P1 print "\n" .end CODE -4123.12 -4123.12 4123.12 -8123.12 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "multiply Float with Integer"); .sub _main @MAIN P10 = new Integer set P10, 4000 P0 = new Float set P0, -123.123 n_mul P1, P0, P10 print P1 print "\n" P30 = P1 P1 = n_mul P0, P10 print P1 print "\n" ## check that we are not reusing P1. ne_addr P30, P1, not_broken print "Broken!\n" not_broken: P1 = n_mul P10, P0 print P1 print "\n" P1 = n_mul P1, -2 print P1 print "\n" .end CODE -492492 -492492 -492492 984984 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "divide Float by Integer"); .sub _main @MAIN P10 = new Integer set P10, 4000 P0 = new Float set P0, -123.123 n_div P1, P0, P10 print P1 print "\n" P30 = P1 P1 = n_div P0, P10 print P1 print "\n" ## check that we are not reusing P1. ne_addr P30, P1, not_broken print "Broken!\n" not_broken: P1 = n_div P0, 1 print P1 print "\n" set P0, 100.000 P1 = n_div P0, 100 print P1 print "\n" P1 = n_div P1, 0.01 print P1 print "\n" .end CODE -0.0307808 -0.0307808 -123.123 1 100 OUTPUT ### ### FLOATVAL and FLOATVAL tests ### pir_output_is(<<'CODE', <<OUTPUT, "add Float to Float"); .sub _main @MAIN P0 = new Float set P0, 4000.246 P1 = new Float set P1, -123.123 P2 = new Float set P2, 6.66 n_add P2, P0, P1 print P2 print "\n" P30 = P2 P2 = n_add P0, P1 print P2 print "\n" ## check that we are not reusing P2. ne_addr P30, P2, not_broken print "Broken!\n" not_broken: .end CODE 3877.12 3877.12 OUTPUT ## This tests n_infix_ic_p_p_nc for n_add, n_sub, n_mul, and n_div. Note that ## there is no n_infix_ic_p_nc_p op; the PMC argument always comes first. pir_output_is(<<'CODE', <<OUTPUT, "add/sub/mul/div of Float with constants"); .sub _main @MAIN P0 = new Float set P0, 4000.246 P1 = new Float set P1, -123.123 P2 = n_add P1, 6.78 print P2 print "\n" P2 = n_add P0, 6.78 print P2 print "\n" P2 = n_mul P1, 6.78 print P2 print "\n" P2 = n_div P0, 6.78 print P2 print "\n" .end CODE -116.343 4007.03 -834.774 590.007 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "subtract Float from Float"); .sub _main @MAIN P0 = new Float set P0, 4000.246 P1 = new Float set P1, -123.123 P2 = new Float set P2, 6.66 n_sub P2, P0, P1 print P2 print "\n" P30 = P2 P2 = n_sub P1, P0 print P2 print "\n" ## check that we are not reusing P2. ne_addr P30, P2, not_broken print "Broken!\n" not_broken: .end CODE 4123.37 -4123.37 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "multiply Float with Float"); .sub _main @MAIN P0 = new Float set P0, 400.0246 P1 = new Float set P1, -123.123 P2 = new Float set P2, 6.66 n_mul P2, P0, P1 print P2 print "\n" P30 = P2 P2 = n_mul P0, P1 print P2 print "\n" ## check that we are not reusing P2. ne_addr P30, P2, not_broken print "Broken!\n" not_broken: .end CODE -49252.2 -49252.2 OUTPUT pir_output_is(<<'CODE', <<OUTPUT, "divide Float by Float"); .sub _main @MAIN P0 = new Float set P0, 4000.246 P1 = new Float set P1, -123.123 P2 = new Float set P2, 6.66 n_div P2, P1, P0 print P2 print "\n" P30 = P2 P2 = n_div P0, P1 print P2 print "\n" ## check that we are not reusing P2. ne_addr P30, P2, not_broken print "Broken!\n" not_broken: .end CODE -0.0307789 -32.4898 OUTPUT