[GiNaC-devel] Bug fixes for polylogs

Stefan Weinzierl stefanw at thep.physik.uni-mainz.de
Tue Jan 21 16:16:25 CET 2014


Hi,

On Sun, 19 Jan 2014, Richard B. Kreckel wrote:

> I see: If one of the x_ is ±1+0.0*I, then it should be assumed to be ±1.
> As discussed, this would go against the principles of CLN. But those
> principles are not GiNaC's which simplifies 2.0*x-x-x to 0, not to 0.0*x.
>
> This just makes me wonder if the elimination of a floating-point zero
> imaginary part would make a useful transformation of class numeric.

I'm not sure if we should do this.
We have in GiNaC also the opposite case, namely that a floating 0.0 is not 
transformed 
into 0, as the following code fragment shows:

  ex t1 = numeric("2.1");
  ex t3 = t1-t1;
  if ( (t3 == 0) && !ex_to<numeric>(t3).is_rational() ) std::cout << "equal to zero, but not rational" << std::endl;

The core of the problem are two different philosophies, what a floating 
point number should be. These two philosophies are:
1. A floating point number represents an intervall, whose size depends on 
Digits.
2. A floating point number is a rational number, which is the closest 
approximation within Digits to the number we want.

The GinaC class numeric is basically a wrapper around CLN, so this is a 
CLN-issue. In my opinion CLN is not strict in implementing one or the 
other philosophy.
This can be seen by looking at the GiNaC-operators is_real() and ==, which 
boil down to the CLN methods instanceof(..., cln::cl_R_ring) and 
equal(...,...).
As we have discussed, 1+0.0*I is not considered to be real, and thus an 
example of philosophy 1.
On the other hand, comparing a float to an exact number as in 1+0.0*I==1, 
the float is converted to a rational number and compared (the details can 
be found in cln-1.3.3/src/real/elem/cl_R_equal.cc). This is basically 
philosophy 2.

However, I would not argue to change this. CLN is a well-established 
library, and changing one of these operators might break other third-party 
programs. Besides, the manual of CLN is quite clear what these operators 
do.

For GiNaC the documentation is not as precise, but this can be improved.
Therefore my suggestions are:

- a small correction to the manual (taking Alexei's comment into account)
- a patch to inifcns_nstdsums.cpp (in order to please Alexei I have 
inserted some extra {...}, however the modification should be in Li_eval, 
there one knows that the arguments are actually +/-1, in zeta2_eval the 
only sensible thing to do would be to call hold(), which is not what we 
want.) A testcase is probably not so helpful, as it can only check for the
re-introduction of the bug in the same place. It is more likely that the 
same bug (or should I say the same feature) in different disguise will hit 
us somewhere else.

I have some hope that we can close this thread.

  Best wishes,

    Stefan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: polylog3.patch
Type: text/x-diff
Size: 1809 bytes
Desc: 
URL: <http://www.cebix.net/pipermail/ginac-devel/attachments/20140121/08bf00c5/attachment.bin>


More information about the GiNaC-devel mailing list