[bug #26190] dec2base test fails due to floating point error

Thorsten Meyer INVALID.NOREPLY at gnu.org
Wed Apr 15 12:16:39 CDT 2009


URL:
  <http://savannah.gnu.org/bugs/?26190>

                 Summary: dec2base test fails due to floating point error
                 Project: GNU Octave
            Submitted by: tmeyier
            Submitted on: Wed 15 Apr 2009 05:16:36 PM UTC
                Category: Libraries
                Severity: 3 - Normal
              Item Group: Incorrect Result
                  Status: Need Info
             Assigned to: tmeyier
         Originator Name: 
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
                 Release: dev
        Operating System: GNU/Linux

    _______________________________________________________

Details:

with the present tip (bb62bc406ea7) (and also with some other recent build,
if I remember correctly) I get two fails for the tests in dec2base.
This simple example demonstrates the problem:
  octave:160> dec2base(999, 10)
  ans = 998

Looking into the code, the following lines seem to be responsible for the
bug:
  power = ones (length (n), 1) * (base .^ (max_len-1 : -1 : 0));
  n = n(:) * ones (1, max_len);
  digits = floor (rem (n, base*power) ./ power);

power is assigned a vector of powers of the base. However, due to floating
point round off error, the numbers in power are not all integers. For the
above example:
octave:161> max_len=3;
octave:162> base=10;
octave:163> n=999;
octave:167> max_len = round (log (max (max (n), 1)) ./ log (base)) + 1
octave:168> power = ones (length (n), 1) * (base .^ (max_len-1 : -1 : 0))
power =

   1000.0000    100.0000     10.0000      1.0000

octave:170> power-1
ans =

   9.9900e+02   9.9000e+01   9.0000e+00   2.2204e-16

octave:171> n = n(:) * ones (1, max_len);
octave:172>  digits = floor (rem (n, base*power) ./ power)
digits =

   0   9   9   8

power(4) is a bit larger than 1, hence the remainder is a bit too small
leading to the result being rounded down to 8.

Changing the definition of power to
 power = ones (length (n), 1) * round (base .^ (max_len-1 : -1 : 0));

seems to fix the problem. 

Still, before making a changeset I would like to ask the floating point
experts among you if that is the right thing to do.

regards

Thorsten






    _______________________________________________________

Reply to this item at:

  <http://savannah.gnu.org/bugs/?26190>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.gnu.org/



More information about the Bug-octave mailing list