|
Prev: Packed decimal versus binary was Re: J4 - presentation/discussion on "Future of the COBOL Standard"
Next: Decimal versus binary arithmetic was Re: J4 - presentation/discussionon "Future of the COBOL Standard"
From: Frank Swarbrick on 1 Apr 2008 15:14 >>> On 4/1/2008 at 12:43 PM, in message <if05v3503beg04nonbeci3n8eqo2vill79(a)4ax.com>, Clark F Morris<cfmpublic(a)ns.sympatico.ca> wrote: > On Mon, 31 Mar 2008 22:37:12 -0600, Robert <no(a)e.mail> wrote: > >>On Mon, 31 Mar 2008 21:55:10 -0300, Clark F Morris ><cfmpublic(a)ns.sympatico.ca> wrote: >> >>>On Tue, 18 Mar 2008 19:34:51 -0600, Robert <no(a)e.mail> wrote: >>> >> >>>>Lots of muddled thinking on numeric errors has been published. Some talk > about 'binary >>>>arithmetic' without making a distinction between integer and floating > point. Here's an >>>>example: >>> >>>Try doing a simple divide like calculate the value of 1 / 5 in binary. >> >>OK. >> >>01 numerator value 1 binary pic 9(9). >>01 denominator value 5 binary pic 9(9). >>01 quotient binary pic 9(9)v9(4). >> >>compute quotient = numerator / denominator >>display quotient >> >>0000000002000 >> >>>You get a never ending fraction. >> >>Looks pretty diadic to me. > You may have to do this in Assembler to get the results that I am > talking about. Take a look at the generated instructions. If I had > access to an IBM mainframe I would compile a small test program to see > what the underlying code is. 5820 9510 L 2,1296(0,9) NUMERATOR 4E20 D1C4 CVD 2,452(0,13) TS2=4 D203 D1C0 C02A MVC 448(4,13),42(12) TS2=0 SYSLIT AT +42 F060 D1C5 0004 SRP 453(7,13),4(0),0 TS2=5 5820 9518 L 2,1304(0,9) DENOMINATOR 4E20 D1D0 CVD 2,464(0,13) TS2=16 FDB4 D1C0 D1D3 DP 448(12,13),467(5,13) TS2=0 TS2=19 F896 D1E0 D1C0 ZAP 480(10,13),448(7,13) TS2=32 TS2=0 960F D1E9 OI 489(13),X'0F' TS2=41 D202 D1D8 C02A MVC 472(3,13),42(12) TS2=24 SYSLIT AT +42 D204 D1DB D1E5 MVC 475(5,13),485(13) TS2=27 TS2=37 4F20 D1D8 CVB 2,472(0,13) TS2=24 F144 D1DB D1E0 MVO 475(5,13),480(5,13) TS2=27 TS2=32 4F50 D1D8 CVB 5,472(0,13) TS2=24 5C40 C004 M 4,4(0,12) SYSLIT AT +4 1E52 ALR 5,2 58B0 C034 L 11,52(0,12) PBL=1 47C0 B698 BC 12,1688(0,11) GN=16(000A70) 5A40 C000 A 4,0(0,12) SYSLIT AT +0 GN=16 EQU * 1222 LTR 2,2 47B0 B6A2 BC 11,1698(0,11) GN=17(000A7A) 5B40 C000 S 4,0(0,12) SYSLIT AT +0 GN=17 EQU * 9045 9520 STM 4,5,1312(9) QUOTIENT Frank
From: Frank Swarbrick on 3 Apr 2008 20:42
>>> On 4/1/2008 at 4:29 PM, in message <jld5v39e0mbt577fcr16ulsgjkquub27vf(a)4ax.com>, Clark F Morris<cfmpublic(a)ns.sympatico.ca> wrote: > On Tue, 1 Apr 2008 13:14:46 -0600, "Frank Swarbrick" > <Frank.Swarbrick(a)efirstbank.com> wrote: > >>>>> On 4/1/2008 at 12:43 PM, in message >><if05v3503beg04nonbeci3n8eqo2vill79(a)4ax.com>, Clark F >>Morris<cfmpublic(a)ns.sympatico.ca> wrote: >>> On Mon, 31 Mar 2008 22:37:12 -0600, Robert <no(a)e.mail> wrote: >>> >>>>On Mon, 31 Mar 2008 21:55:10 -0300, Clark F Morris >>><cfmpublic(a)ns.sympatico.ca> wrote: >>>> >>>>>On Tue, 18 Mar 2008 19:34:51 -0600, Robert <no(a)e.mail> wrote: >>>>> >>>> >>>>>>Lots of muddled thinking on numeric errors has been published. Some talk >> >>> about 'binary >>>>>>arithmetic' without making a distinction between integer and floating >>> point. Here's an >>>>>>example: >>>>> >>>>>Try doing a simple divide like calculate the value of 1 / 5 in binary. >>>> >>>>OK. >>>> >>>>01 numerator value 1 binary pic 9(9). >>>>01 denominator value 5 binary pic 9(9). >>>>01 quotient binary pic 9(9)v9(4). >>>> >>>>compute quotient = numerator / denominator >>>>display quotient >>>> >>>>0000000002000 >>>> >>>>>You get a never ending fraction. >>>> >>>>Looks pretty diadic to me. >>> You may have to do this in Assembler to get the results that I am >>> talking about. Take a look at the generated instructions. If I had >>> access to an IBM mainframe I would compile a small test program to see >>> what the underlying code is. >> >>5820 9510 L 2,1296(0,9) NUMERATOR > >> >>4E20 D1C4 CVD 2,452(0,13) TS2=4 > >> >>D203 D1C0 C02A MVC 448(4,13),42(12) TS2=0 > >> SYSLIT AT +42 >>F060 D1C5 0004 SRP 453(7,13),4(0),0 TS2=5 > >> >>5820 9518 L 2,1304(0,9) DENOMINATOR > >> >>4E20 D1D0 CVD 2,464(0,13) TS2=16 > >> >>FDB4 D1C0 D1D3 DP 448(12,13),467(5,13) TS2=0 > >> TS2=19 >>F896 D1E0 D1C0 ZAP 480(10,13),448(7,13) TS2=32 > >> TS2=0 >>960F D1E9 OI 489(13),X'0F' TS2=41 > >> >>D202 D1D8 C02A MVC 472(3,13),42(12) TS2=24 > >> SYSLIT AT +42 >>D204 D1DB D1E5 MVC 475(5,13),485(13) TS2=27 > >> TS2=37 >>4F20 D1D8 CVB 2,472(0,13) TS2=24 > >> >>F144 D1DB D1E0 MVO 475(5,13),480(5,13) TS2=27 > >> TS2=32 >>4F50 D1D8 CVB 5,472(0,13) TS2=24 > >> >>5C40 C004 M 4,4(0,12) SYSLIT AT +4 > >> >>1E52 ALR 5,2 > >> >>58B0 C034 L 11,52(0,12) PBL=1 > >> >>47C0 B698 BC 12,1688(0,11) GN=16(000A70) > >> >>5A40 C000 A 4,0(0,12) SYSLIT AT +0 > >> >> GN=16 EQU * > >> >>1222 LTR 2,2 >>47B0 B6A2 BC 11,1698(0,11) GN=17(000A7A) >>5B40 C000 S 4,0(0,12) SYSLIT AT +0 >> GN=17 EQU * >>9045 9520 STM 4,5,1312(9) QUOTIENT > > Wow, they are actually doing this in decimal. I wonder what the code > would be like using binary instructions. I see they are handling the > remainder separately. I was amazed that the 'v' in the PICTURE clause was even allowed for a COMP data item. I just assumed that it had to be DISPLAY, PACKED-DECIMAL or a floating point field for a decimal to be allowed. Not sure *why* I thought this, but this was definitely the first time I had ever seen this. For what its worth, here it is with the data items declared as 01 NUMERATOR VALUE 1 BINARY PIC 9(9)V9(4). 01 DENOMINATOR VALUE 5 BINARY PIC 9(9)V9(4). 01 QUOTIENT BINARY PIC 9(9)V9(4). LM 2,3,1376(9) NUMERATOR D 2,4(0,12) SYSLIT AT +4 CVD 3,480(0,13) TS2=16 MVO 470(6,13),483(5,13) TS2=6 TS2=19 CVD 2,480(0,13) TS2=16 TM 475(13),X'10' TS2=11 MVC 475(5,13),483(13) TS2=11 TS2=19 L 11,52(0,12) PBL=1 BC 8,1832(0,11) GN=18(000B10) OI 479(13),X'01' TS2=15 EQU * MVC 464(6,13),42(12) TS2=0 SYSLIT AT +42 SRP 471(9,13),4(0),0 TS2=7 LM 2,3,1384(9) DENOMINATOR D 2,4(0,12) SYSLIT AT +4 CVD 3,496(0,13) TS2=32 MVO 480(6,13),499(5,13) TS2=16 TS2=35 CVD 2,496(0,13) TS2=32 TM 485(13),X'10' TS2=21 MVC 485(5,13),499(13) TS2=21 TS2=35 BC 8,1884(0,11) GN=19(000B44) OI 489(13),X'01' TS2=25 EQU * DP 464(16,13),483(7,13) TS2=0 TS2=19 ZAP 504(10,13),466(7,13) TS2=40 TS2=2 OI 513(13),X'0F' TS2=49 MVC 496(3,13),42(12) TS2=32 SYSLIT AT +42 MVC 499(5,13),509(13) TS2=35 TS2=45 CVB 2,496(0,13) TS2=32 MVO 499(5,13),504(5,13) TS2=35 TS2=40 CVB 5,496(0,13) TS2=32 M 4,4(0,12) SYSLIT AT +4 ALR 5,2 BC 12,1940(0,11) GN=20(000B7C) A 4,0(0,12) SYSLIT AT +0 EQU * LTR 2,2 BC 11,1950(0,11) GN=21(000B86) S 4,0(0,12) SYSLIT AT +0 EQU * STM 4,5,1392(9) QUOTIENT It appears it is still converting the binary data to packed decimal and then doing the calculations. Frank |