PATCH for "Parenthesization bug"

Roberto Bagnara bagnara at cs.unipr.it
Fri Jan 25 18:28:27 CET 2002


"Richard B. Kreckel" wrote:
> 
> Hi,
> 
> On Fri, 25 Jan 2002, Roberto Bagnara wrote:
> > there is a bug somewhere in GiNaC whereby some non-redundant parentheses
> > are not output.  The problem is shown below by means of simple `ginsh'
> > session, but it can be reproduced equally well with C++ code.
> >
> > $ ginsh
> > ginsh - GiNaC Interactive Shell (GiNaC V1.0.4)
> >   __,  _______  Copyright (C) 1999-2002 Johannes Gutenberg University Mainz,
> >  (__) *       | Germany.  This is free software with ABSOLUTELY NO WARRANTY.
> >   ._) i N a C | You are welcome to redistribute it under certain conditions.
> > <-------------' For details type `warranty;'.
> >
> > Type ?? for a list of help topics.
> > > 2*I^(1/3);
> > 2*I^(1/3)
> > > (2*I)^(1/3);
> > 2*I^(1/3)
> > > 2*(I^(1/3));
> > 2*I^(1/3)
> > >
> >
> > If this is confirmed to be a bug, we would need to develop a fix or
> > a workaround quite urgently.
> 
> Indeed, it's a bug.  Internally, these are differnt objects.  It just
> seems to be their output, i.e. power::print().  Look at this:
> > (2*I)^(1/3);
> 2*I^(1/3)
> > print(%);
> power, hash=0xbffff638, flags=0x3, nops=2
>     2i (numeric), hash=0x80000840, flags=0xf
>     1/3 (numeric), hash=0x80000020, flags=0xf
> 
> Can you look into that method?

I checked power::print(), but this looks fine.
The problem is, I believe, in numeric::print().
A patch that solves the problem is attached:
it passes `make check' and fixes also the related bug
exemplified by the following excerpt from a ginsh session (1.0.4):

> (-I)^e;
(I)^e

What is your advice?  Given that we cannot put up with that bugs,
should we install the patched version on all our machines
or should we wait for 1.0.5?  Translation: do you plan to release
1.0.5 RSN?  ;-)

All the best

     Roberto


P.S.  Did my patch adding erase_all() to the containers find its
      way to the CVS branch?

-- 
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara at cs.unipr.it
-------------- next part --------------
diff -rcp GiNaC-1.0.4.orig/ginac/numeric.cpp GiNaC-1.0.4/ginac/numeric.cpp
*** GiNaC-1.0.4.orig/ginac/numeric.cpp	Thu Jan 24 22:40:11 2002
--- GiNaC-1.0.4/ginac/numeric.cpp	Fri Jan 25 17:52:29 2002
*************** void numeric::print(const print_context 
*** 403,427 ****
  		} else {
  			if (cln::zerop(r)) {
  				// case 2, imaginary:  y*I  or  -y*I
! 				if ((precedence() <= level) && (i < 0)) {
! 					if (i == -1) {
! 						c.s << par_open+imag_sym+par_close;
! 					} else {
  						c.s << par_open;
  						print_real_number(c, i);
! 						c.s << mul_sym+imag_sym+par_close;
! 					}
! 				} else {
! 					if (i == 1) {
! 						c.s << imag_sym;
! 					} else {
! 						if (i == -1) {
! 							c.s << "-" << imag_sym;
! 						} else {
! 							print_real_number(c, i);
! 							c.s << mul_sym+imag_sym;
! 						}
  					}
  				}
  			} else {
  				// case 3, complex:  x+y*I  or  x-y*I  or  -x+y*I  or  -x-y*I
--- 403,421 ----
  		} else {
  			if (cln::zerop(r)) {
  				// case 2, imaginary:  y*I  or  -y*I
! 				if (i == 1)
! 					c.s << imag_sym;
! 				else {
! 					if (precedence() <= level)
  						c.s << par_open;
+ 					if (i == -1)
+ 						c.s << "-" << imag_sym;
+ 					else {
  						print_real_number(c, i);
! 						c.s << mul_sym+imag_sym;
  					}
+ 					if (precedence() <= level)
+ 						c.s << par_close;
  				}
  			} else {
  				// case 3, complex:  x+y*I  or  x-y*I  or  -x+y*I  or  -x-y*I


More information about the GiNaC-devel mailing list