Okay, I managed to figure out a way of getting the debug information back into the libgcobol.
The addition is done by the routine __gg__add_fixed_phase1() The run-tiome inputs to that routine should be 1 and 55555555555. What's coming through in the patched code are 1 and 55555555554 I haven't looked at the compile-time code yet. But I have a nickel that says somebody is converting "555.55555555" to floating-point, and getting an internal value of 555.555555549999999...., and that's getting truncated to the internal value of 55555555554 I haven't checked for sure, but I suppose I've been counting on the strfromf128 routines to round sensibly. I guess if mpfr can handle that kind of thing, then we should switch to mpfr. I am not that familiar with mpfr. > -----Original Message----- > From: Robert Dubner <rdub...@symas.com> > Sent: Thursday, March 20, 2025 17:50 > To: Jakub Jelinek <ja...@redhat.com> > Cc: Richard Biener <rguent...@suse.de>; gcc-patches@gcc.gnu.org > Subject: RE: [PATCH][RFC] [cobol] change cbl_field_data_t::etc_t::value > from _Float128 to tree > > It's time to slow down a bit and give me a chance to catch up. > > First, all those tests are not arbitrary. I was getting the correct > answers before, and it was not an insignificant effort to get them correct > in the first place. > > If we don't get the same answers, then something isn't the same as it was > before. > > I need to know what. > > First-prime: > > Also, keep in mind that this is COBOL, where words don't mean what you > think they mean. Under Rounding, we have > > The following forms of rounding are provided (examples presume an integer > destination): > > -AWAY-FROM-ZERO: Rounding is to the nearest value farther from zero. > > -NEAREST-AWAY-FROM-ZERO: Rounding is to the nearest value. If two values > are equally near, the value farther from zero is selected. This mode has > historically been associated with the ROUNDED clause in earlier versions > of standard COBOL. > > -NEAREST-EVEN: Rounding is to the nearest value. If two values are equally > near, the value whose rightmost digit is even is selected. This mode is > sometimes called "Banker's rounding". > > -NEAREST-TOWARD-ZERO: Rounding is to the nearest value. If two values are > equally near, the value nearer to zero is selected. > > -PROHIBITED: No rounding is performed. If the value cannot be represented > exactly in the desired format, the EC-SIZE-TRUNCATION condition is set to > exist and the results of the operation are undefined. > > -TOWARD-GREATER: Rounding is toward the nearest value whose algebraic > value is larger. > > -TOWARD-LESSER: Rounding is toward the nearest value whose algebraic value > is smaller. > > -TRUNCATION: Rounding is to the nearest value that is nearer to zero than > the algebraic value. This mode has historically been associated with the > absence of the ROUNDED clause as well as for the formation of intermediate > results in the prior COBOL standard. > > Any of those can be set as the default. > > Second, I just tried to debug the way I have been debugging for years -- > and I can't. > > I wanted to check that the attempt to add 0.00000001 to 555.55555555 was > actually adding those two numbers. This wasn't a rounding problem. Both > of those numbers have eight decimal places. So, internally, 1 is supposed > to be added to a 64-bit integer value 55555555555 to get 55555555556 > > I am suspicious that the 0.00000001 is becoming zero, which would result > in the 555.55555555 being unchanged. > > To do an initial check of this, I tried to trap at __gg__add_fixed_phase1 > > But libgcobol.so has no debug info. So, somehow, the way I used to cause > it to be "-ggdb -O0" has gotten lost. I need it back. > > What I have been doing, lo these many months, is compiling after doing > this ../configure > > CFLAGS="-ggdb -O0" \ > CXXFLAGS="-ggdb -O0" \ > CFLAGS_FOR_BUILD="-ggdb" \ > CXXFLAGS_FOR_BUILD="-ggdb" \ > LIBCFLAGS_FOR_BUILD="-ggdb" \ > LIBCXXFLAGS_FOR_BUILD="-ggdb" \ > CFLAGS_FOR_TARGET="-ggdb -O0" \ > CXXFLAGS_FOR_TARGET="-ggdb -O0" \ > LIBCFLAGS_FOR_TARGET="-ggdb -O0" \ > LIBCXXFLAGS_FOR_TARGET="-ggdb -O0" \ > ../configure \ > --with-pkgversion="$PKGVERSION" \ > --enable-languages=c,c++,cobol \ > --prefix=/usr/local/gcobol \ > --with-gcc-major-version-only \ > --program-suffix=-$MAJOR_VERSION \ > --enable-shared \ > --enable-linker-build-id \ > --without-included-gettext \ > --enable-threads=posix \ > --disable-bootstrap \ > --enable-clocale=gnu \ > --enable-libstdcxx-debug \ > --enable-libstdcxx-time=yes \ > --with-default-libstdcxx-abi=new \ > --enable-gnu-unique-object \ > --disable-vtable-verify \ > --enable-plugin \ > --enable-default-pie \ > --with-system-zlib \ > --with-target-system-zlib=auto \ > --disable-werror \ > --disable-cet \ > $arch_options \ > --disable-multilib \ > --without-cuda-driver \ > --enable-checking \ > --build=$arch-linux-gnu \ > --host=$arch-linux-gnu \ > --target=$arch-linux-gnu \ > --with-build-config=bootstrap-lto-lean \ > --enable-link-mutex --without-isl > > And, no, I don't know what much of that means. I cloned it from the > Ubuntu "gcc -v" description of their configuration. > > But I do know that one of those flag settings used to control the build of > the library. But now the library isn't being built with debug_info, and I > need it to be. > > I'll start looking, but any help would be appreciated. > > > -----Original Message----- > > From: Jakub Jelinek <ja...@redhat.com> > > Sent: Thursday, March 20, 2025 17:07 > > To: Robert Dubner <rdub...@symas.com> > > Cc: Richard Biener <rguent...@suse.de>; gcc-patches@gcc.gnu.org > > Subject: Re: [PATCH][RFC] [cobol] change cbl_field_data_t::etc_t::value > > from _Float128 to tree > > > > On Thu, Mar 20, 2025 at 03:30:30PM -0500, Robert Dubner wrote: > > > Let me find one inky-dink example. Talk amongst yourselves...here we > > go. > > > > > > identification division. > > > program-id. prog. > > > data division. > > > working-storage section. > > > 77 var8 PIC 999V9(8) COMP-5 . > > > 77 var555 PIC 999V99999999 COMP-5 VALUE 555.55555555. > > > procedure division. > > > move 555.55555555 to var8 > > > add 0.00000001 TO var555 giving var8 rounded > > > if var8 not equal to 555.55555556 display var8 " should be > > > 555.55555556". > > > end program prog. > > > > > > With your patches, the output is > > > > > > 555.55555555 should be 555.55555556 > > > > Thanks. > > Now, the code certainly could try to do the rounding of the last digits > > based on the remaining digits in the string that are being discarded, > > if followed by 0-4, don't change anything, if followed by 6-9, increase > > last digit, if followed by 5 and any non-zero digit, increase too, if > > followed > > by 5 and all zeros, round to even. > > But I'm afraid it can have double rounding, when round_to_decimal rounds > > for the precision 33 printing something e.g. with 49999999999999999999 > at > > the end to 500000000000 and this second rounding again. > > So I really think we should go to mpfr, I can implement it tomorrow > unless > > Richi wants to do that. > > > > Jakub