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