abase=:**[:#:| abase _77 1 0 _1 13 _1 0 0 _1 _1 0 _1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 _1 0 0 0 1 1 0 1 #.abase _77 1 0 _1 13 _77 1 0 _1 13
The dictionary does not mention how #: handles negative numbers. It turns out that it represents the number in twos-complement form, which seems to me to be the most useful. Like building the internal representation of a number as stored in a word where the computer uses twos-complement to represent negative numbers. (16#2)#:_77 77 0 _1 1 NB. Signed numbers for a 16 bit word size 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 But if you want to see something weird, try complex numbers. #:0j_77 77 0j_1 0 0 0j_1 0j_1 0 0j_1 0 _1 _1 0 0 _1 _1 On Tue, Dec 27, 2011 at 1:34 AM, Linda Alvord <lindaalv...@verizon.net>wrote: > Here are my latest thoughts on negative binary numbers. > > a=:1 0 0 1 1 0 1 > #.a > 77 > b=:-a > b > _1 0 0 _1 _1 0 _1 > #.b > _77 > > The challenge is to get from _77 to _1 0 0 _1 _1 0 _1 which should be > the result that #: provides. But that is not what happens: > > #:#.b > 0 1 1 0 0 1 1 > #.#:#.b > 51 > > So here is a script which does that. It has lots of possibilities for > simplification but it does give an idea of a possible approach. If someone > can write the parts in loops or recursive style it would be interesting to > compare results. I'm not a J programmer, but rather a J user who would like > #: to work. > Have fun, share your ideas. > > > ]n=:15 > NB.Number of places like 4 for a 4 digit number > d=: 13 :'-?y#2' > d > ]dd=:d n > NB. d creates an n digit negative binary number > w=: 13 :'2^|.i.y' > w > w n > NB. w is a weighting list for each place value > ]nd=:#.dd > NB. nd converts a negative binary to a negative decimaldecimal number > NB.nd=:_432532 insert a specific decimal to convert it > ]p=:+/nd <-w 20 > ]b1=:-1=<.nd%-w n > ]r1=:nd-#.b1 > ]b2=:-1=<.r1%-w n > ]r2=:nd-#.b1+b2 > ]b3=:-1=<.r2%-w n > ]r3=:nd-#.b1+b2+b3 > ]b4=:-1=<.r3%-w n > ]r4=:nd-#.b1+b2+b3+b4 > ]b5=:-1=<.r4%-w n > ]r5=:nd-#.b1+b2+b3+b4+b5 > ]b6=:-1=<.r5%-w n > ]r6=:nd-#.b1+b2+b3+b4+b5+b6 > ]b7=:-1=<.r6%-w n > ]r7=:nd-#.b1+b2+b3+b4+b5+b6+b7 > ]b8=:-1=<.r7%-w n > ]r8=:nd-#.b1+b2+b3+b4+b5+b6+b7+b8 > ]b9=:-1=<.r8%-w n > ]nb=:b1+b2+b3+b4+b5+b6+b7+b8+b9 > #.nb > NB. nb has created the correct negative binary number > ]dd > #.dd > ]p > NB.nb id the binary created from a negative decimal number > #:nd > #.#:nd > NB. results with problems > > Linda > > > > -----Original Message----- > From: programming-boun...@jsoftware.com > [mailto:programming-boun...@jsoftware.com] On Behalf Of Kip Murray > Sent: Saturday, December 17, 2011 2:02 AM > To: Programming forum > Subject: Re: [Jprogramming] How #: should have been designed > > Linda, if you look over my original post, shown way below, you will see > I used a verb of Raul's named twoscomplement and then a verb of mine > named tc. Don't overlook Raul's part at the very bottom. Raul has > since presented a corrected version of twoscomplement. It appears to me > what you got from my verb tc is the same as what I got. I will think > over your work below, in particular the part about f and #.f . Kip > > On 12/16/2011 9:16 PM, Linda Alvord wrote: > > > > Kip, I get a different result from tc than you show in your original > post. > > Using J I get: > > > > tc =: #:~2 #~ [:>./ 1 + [:>. (2 ^. |)`(2 ^.>:)@.(0<: ])"0 > > ]a=:tc i:6 > > 1 0 1 0 > > 1 0 1 1 > > 1 1 0 0 > > 1 1 0 1 > > 1 1 1 0 > > 1 1 1 1 > > 0 0 0 0 > > 0 0 0 1 > > 0 0 1 0 > > 0 0 1 1 > > 0 1 0 0 > > 0 1 0 1 > > 0 1 1 0 > > > > This is copied from your post: > > > > The verb tc (two's complement) appears to work > > > > tc =: #:~ 2 #~ [:>./ 1 + [:>. (2 ^. |)`(2 ^.>:)@.(0<: ])"0 > > > > twoscomplement i: 6 > > 0 1 0 > > 0 1 1 > > 1 0 0 > > 1 0 1 > > 1 1 0 > > 1 1 1 > > 0 0 0 > > 0 0 1 > > 0 1 0 > > 0 1 1 > > 1 0 0 > > 1 0 1 > > 1 1 0 > > > > Call this b: > > > > ]b=: }."1 a > > 0 1 0 > > 0 1 1 > > 1 0 0 > > 1 0 1 > > 1 1 0 > > 1 1 1 > > 0 0 0 > > 0 0 1 > > 0 1 0 > > 0 1 1 > > 1 0 0 > > 1 0 1 > > 1 1 0 > > > > c=:#:i:6 > > c > > 0 1 0 > > 0 1 1 > > 1 0 0 > > 1 0 1 > > 1 1 0 > > 1 1 1 > > 0 0 0 > > 0 0 1 > > 0 1 0 > > 0 1 1 > > 1 0 0 > > 1 0 1 > > 1 1 0 > > (}."1 tc i:6)-:(#:i:6) > > 1 > > b-:c > > 1 > > tcinv=:[: #. (* (_1 ^ 0= i.@#))"1 > > tcinv a > > _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 > > > > tcinv b > > 2 3 _4 _3 _2 _1 0 1 2 3 _4 _3 _2 > > > > So I thought you really meant the four column result in a . > > > > However the array in b matches the result of using #: on i: > > > > ]c=:#:i:6 > > 0 1 0 > > 0 1 1 > > 1 0 0 > > 1 0 1 > > 1 1 0 > > 1 1 1 > > 0 0 0 > > 0 0 1 > > 0 1 0 > > 0 1 1 > > 1 0 0 > > 1 0 1 > > 1 1 0 > > > > b-:c > > 1 > > > > No matter if it was created by #: or by tc , it is an array of > unique > > numbers. It only represents the following list. > > > > #.b > > 2 3 4 5 6 7 0 1 2 3 4 5 6 > > #.c > > 2 3 4 5 6 7 0 1 2 3 4 5 6 > > > > This is incorrect. > > > > Now consider: > > > > (8+i.15)-15#15 > > _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7 > > > > d=:(#:8+i.15)-((5#2)#:,15#15) > > d > > 0 0 _1 _1 _1 > > 0 0 _1 _1 0 > > 0 0 _1 0 _1 > > 0 0 _1 0 0 > > 0 0 0 _1 _1 > > 0 0 0 _1 0 > > 0 0 0 0 _1 > > 0 0 0 0 0 > > 1 _1 _1 _1 _1 > > 1 _1 _1 _1 0 > > 1 _1 _1 0 _1 > > 1 _1 _1 0 0 > > 1 _1 0 _1 _1 > > 1 _1 0 _1 0 > > 1 _1 0 0 _1 > > > > The array in d is a beautiful representation of negative binary numbers. > > They include negative signs. If the leftmost digit is negative, the > number > > is negative. Look only at the top and if you recognize the pattern as 5 > it > > will > > Be negative 5 > > > > The array follows traditional place value. > > > > |.2^i.5 > > 16 8 4 2 1 > > > > d*($d)$|.2^i.5 > > 0 0 _4 _2 _1 > > 0 0 _4 _2 0 > > 0 0 _4 0 _1 > > 0 0 _4 0 0 > > 0 0 0 _2 _1 > > 0 0 0 _2 0 > > 0 0 0 0 _1 > > 0 0 0 0 0 > > 16 _8 _4 _2 _1 > > 16 _8 _4 _2 0 > > 16 _8 _4 0 _1 > > 16 _8 _4 0 0 > > 16 _8 0 _2 _1 > > 16 _8 0 _2 0 > > 16 _8 0 0 _1 > > > > +/"1 d*($d)$|.2^i.5 > > _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7 > > > > And the sum of the value of the digits is correct. Furthermore, #. > > Understands it with no change in code. > > > > #.d > > _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7 > > > > > > My contention is that if we, the users, could get used to negative > numbers, > > as we have learned to like _123.132j432.23 we would embrace these six > > binary representations: > > > > f=:0,.0,.(?6 7$3){_1 0 1 > > f > > 0 0 _1 1 1 0 _1 _1 1 > > 0 0 1 _1 0 1 1 _1 0 > > 0 0 0 _1 _1 _1 _1 1 _1 > > 0 0 0 0 _1 1 0 0 1 > > 0 0 1 0 _1 _1 0 0 0 > > 0 0 1 _1 1 _1 1 0 1 > > > > The two columns of 0's are necessary for this to work correctly. > > > > Using place value and J we can "read" these numbers correctly > > > > f*($f)$|.2^i.9 > > > > 0 0 _64 32 16 0 _4 _2 1 > > 0 0 64 _32 0 8 4 _2 0 > > 0 0 0 _32 _16 _8 _4 2 _1 > > 0 0 0 0 _16 8 0 0 1 > > 0 0 64 0 _16 _8 0 0 0 > > 0 0 64 _32 16 _8 4 0 1 > > > > +/"1 f*($f)$|.2^i.9 > > _21 42 _59 _7 40 45 > > > > And with no change in code, #. Gives the same results > > > > #.f > > _21 42 _59 _7 40 45 > > > > It is only #: that must be changed. I would think this would be fairly > > straightforward if these representatives of negative binary numbers were > > adopted. > > > > #:#.f > > > > 1 1 1 1 1 0 0 > > 0 1 0 0 0 1 0 > > 0 1 1 1 1 0 1 > > 1 0 1 0 0 1 0 > > 0 1 1 1 0 1 1 > > 1 1 0 0 0 1 0 > > > > Since the current representation that #: provides has only positive > numbers > > it is where the changes are necessary. > > > > Finally ou would never see the displays above if you only consider > positive > > integers. > > > > ]e=:#:i.7 > > 0 0 0 > > 0 0 1 > > 0 1 0 > > 0 1 1 > > 1 0 0 > > 1 0 1 > > 1 1 0 > > #.e > > 0 1 2 3 4 5 6 > > > > So, my take on this is that the user must learn to accept a new way of > > understanding of what binary numbers look like. They will be unique. You > > can identify the sign by the leading element. If you can read the number > in > > binary, it will be the same number but negative. > > > > I keep trying to explain, and as I do it is getting easier for me to > > understand what I am saying. That's I guess how you learn, by trying to > > teach. > > > > Linda > > > > > > > > > > > > > > > > > > > > -----Original Message----- > > From: programming-boun...@jsoftware.com > > [mailto:programming-boun...@jsoftware.com] On Behalf Of Kip Murray > > Sent: Friday, December 16, 2011 1:53 PM > > To: Programming forum > > Subject: Re: [Jprogramming] How #: should have been designed > > > > You need to use Marshall's two's complement inverse > > > > tcinv > > [: #. (* (_1 ^ 0 = i.@#))"1 > > tcinv tc i: 6 > > _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 > > > > In emails I insert an extra space in front of J output -- this seems to > > protect it from the vagaries of email. > > > > I will look at your post, thanks for repeating it. > > > > On 12/16/2011 2:40 AM, Linda Alvord wrote: > >> Here's what I get. The line will split but when I paste it back > together: > >> > >> tc =: #:~ 2 #~ [:>./ 1 + [:>. (2 ^. |)`(2 ^.>:)@.(0<: ])"0 > >> ]a=:tc i:6 > >> 1 0 1 0 > >> 1 0 1 1 > >> 1 1 0 0 > >> 1 1 0 1 > >> 1 1 1 0 > >> 1 1 1 1 > >> 0 0 0 0 > >> 0 0 0 1 > >> 0 0 1 0 > >> 0 0 1 1 > >> 0 1 0 0 > >> 0 1 0 1 > >> 0 1 1 0 > >> #.a > >> 10 11 12 13 14 15 0 1 2 3 4 5 6 > >> > >> Not good. But your display does not have the first column, so maybe you > > need > >> to post the function again. > >> > >> I tried to remove the first column to match your dislay: > >> > >> ]b=:1}."1 a > >> 0 1 0 > >> 0 1 1 > >> 1 0 0 > >> 1 0 1 > >> 1 1 0 > >> 1 1 1 > >> 0 0 0 > >> 0 0 1 > >> 0 1 0 > >> 0 1 1 > >> 1 0 0 > >> 1 0 1 > >> 1 1 0 > >> > >> #.b > >> 2 3 4 5 6 7 0 1 2 3 4 5 6 > >> > >> This is also not working. > >> > >> Did you really read my post in a reply to a message to Devon? I'll > repeat > > it > >> here as I am interested in your comments: > >> > >> ]a=:8+i.15 > >> 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 > >> ]b=:15#15 > >> 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 > >> ]c=:a-b > >> _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7 > >> f=: 13 :'(x#2)#:y' > >> f > >> ] #:~ 2 #~ [ > >> > >> The function f converts the lists to binary numbers. The largest number > > 22 > >> is less than 32 so only 5 digits are require. > >> > >> ]aa=:5 f a > >> 0 1 0 0 0 > >> 0 1 0 0 1 > >> 0 1 0 1 0 > >> 0 1 0 1 1 > >> 0 1 1 0 0 > >> 0 1 1 0 1 > >> 0 1 1 1 0 > >> 0 1 1 1 1 > >> 1 0 0 0 0 > >> 1 0 0 0 1 > >> 1 0 0 1 0 > >> 1 0 0 1 1 > >> 1 0 1 0 0 > >> 1 0 1 0 1 > >> 1 0 1 1 0 > >> > >> ]bb=:5 f b > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> 0 1 1 1 1 > >> > >> The result below is the difference in J between the two arrays > above. > > It > >> is not a conversion using #: > >> > >> ]cc=:aa-bb > >> 0 0 _1 _1 _1 > >> 0 0 _1 _1 0 > >> 0 0 _1 0 _1 > >> 0 0 _1 0 0 > >> 0 0 0 _1 _1 > >> 0 0 0 _1 0 > >> 0 0 0 0 _1 > >> 0 0 0 0 0 > >> 1 _1 _1 _1 _1 > >> 1 _1 _1 _1 0 > >> 1 _1 _1 0 _1 > >> 1 _1 _1 0 0 > >> 1 _1 0 _1 _1 > >> 1 _1 0 _1 0 > >> 1 _1 0 0 _1 > >> > >> For comparison, the result cc2 is obtained as a J result using #: > >> ]cc2=: 5 f c > >> 1 1 0 0 1 > >> 1 1 0 1 0 > >> 1 1 0 1 1 > >> 1 1 1 0 0 > >> 1 1 1 0 1 > >> 1 1 1 1 0 > >> 1 1 1 1 1 > >> 0 0 0 0 0 > >> 0 0 0 0 1 > >> 0 0 0 1 0 > >> 0 0 0 1 1 > >> 0 0 1 0 0 > >> 0 0 1 0 1 > >> 0 0 1 1 0 > >> 0 0 1 1 1 > >> > >> Or: > >> > >> ]cc3=:#:c > >> 0 0 1 > >> 0 1 0 > >> 0 1 1 > >> 1 0 0 > >> 1 0 1 > >> 1 1 0 > >> 1 1 1 > >> 0 0 0 > >> 0 0 1 > >> 0 1 0 > >> 0 1 1 > >> 1 0 0 > >> 1 0 1 > >> 1 1 0 > >> 1 1 1 > >> > >> Both cc2 and cc3 seem implausible because all numbers are known positive > >> numbers. Now look at cc : > >> > >> w=: 13 :'(x,y)$|.2^i.y' > >> w > >> , $ [: |. 2 ^ [: i. ] > >> 15 w 5 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> 16 8 4 2 1 > >> > >> cc*15 w 5 > >> 0 0 _4 _2 _1 > >> 0 0 _4 _2 0 > >> 0 0 _4 0 _1 > >> 0 0 _4 0 0 > >> 0 0 0 _2 _1 > >> 0 0 0 _2 0 > >> 0 0 0 0 _1 > >> 0 0 0 0 0 > >> 16 _8 _4 _2 _1 > >> 16 _8 _4 _2 0 > >> 16 _8 _4 0 _1 > >> 16 _8 _4 0 0 > >> 16 _8 0 _2 _1 > >> 16 _8 0 _2 0 > >> 16 _8 0 0 _1 > >> > >> > >> +/"1 cc*15 w 5 > >> _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7 > >> > >> This is c! > >> > >> Not only that, J knows it is c. > >> > >> #.cc > >> _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7 > >> > >> So what do you think? > >> > >> Linda > >> > >> -----Original Message----- > >> From: programming-boun...@jsoftware.com > >> [mailto:programming-boun...@jsoftware.com] On Behalf Of Kip Murray > >> Sent: Friday, December 16, 2011 2:43 AM > >> To: Programming forum > >> Subject: Re: [Jprogramming] How #: should have been designed > >> > >> The verb tc (two's complement) appears to work > >> > >> tc =: #:~ 2 #~ [:>./ 1 + [:>. (2 ^. |)`(2 ^.>:)@.(0<: ])"0 > >> > >> twoscomplement i: 6 > >> 0 1 0 > >> 0 1 1 > >> 1 0 0 > >> 1 0 1 > >> 1 1 0 > >> 1 1 1 > >> 0 0 0 > >> 0 0 1 > >> 0 1 0 > >> 0 1 1 > >> 1 0 0 > >> 1 0 1 > >> 1 1 0 > >> > >> tc i: 6 > >> 1 0 1 0 > >> 1 0 1 1 > >> 1 1 0 0 > >> 1 1 0 1 > >> 1 1 1 0 > >> 1 1 1 1 > >> 0 0 0 0 > >> 0 0 0 1 > >> 0 0 1 0 > >> 0 0 1 1 > >> 0 1 0 0 > >> 0 1 0 1 > >> 0 1 1 0 > >> > >> > >> On 12/15/2011 12:52 PM, Kip Murray wrote: > >>> twoscomplement i: 4 NB. error > >>> 1 0 0 > >>> 1 0 1 > >>> 1 1 0 > >>> 1 1 1 > >>> 0 0 0 > >>> 0 0 1 > >>> 0 1 0 > >>> 0 1 1 > >>> 1 0 0 > >>> > >>> rp =: [: }: [: i: 2 ^<: NB. representable in y bits > >>> > >>> rp 3 > >>> _4 _3 _2 _1 0 1 2 3 > >>> > >>> twoscomplement rp 3 NB. OK > >>> 1 0 0 > >>> 1 0 1 > >>> 1 1 0 > >>> 1 1 1 > >>> 0 0 0 > >>> 0 0 1 > >>> 0 1 0 > >>> 0 1 1 > >>> > >>> > >>> On 12/14/2011 9:13 AM, Raul Miller wrote: > >>>> The subject line of this thread is arguably wrong -- there are a > >>>> variety of "good ways" of decomposing integers to binary. > >>>> > >>>> That said, it's interesting to think about the various proposals > >>>> expressed in terms similar to those which could be used to implement > >>>> monadic #: > >>>> > >>>> antibase2=: #:~ 2 #~ 1 + 2<.@^. 1>.>./@,@:|@:<. > >>>> twoscomplement=: #:~ 2 #~ 1 + 2<.@^. 1 +>./@,@:|@:<. > >>>> signwithbits=: #:~ 0, 2 #~ 1 + 2<.@^. 1>.>./@,@:|@:<. > >>>> > >>>> (In all cases the #: here is dyadic, so these definitions are > >>>> independent of the definition of monadic #:) > >>>> > >>>> antibase2 i: 3 > >>>> 0 1 > >>>> 1 0 > >>>> 1 1 > >>>> 0 0 > >>>> 0 1 > >>>> 1 0 > >>>> 1 1 > >>>> twoscomplement i: 3 > >>>> 1 0 1 > >>>> 1 1 0 > >>>> 1 1 1 > >>>> 0 0 0 > >>>> 0 0 1 > >>>> 0 1 0 > >>>> 0 1 1 > >>>> signwithbits i: 3 > >>>> _1 0 1 > >>>> _1 1 0 > >>>> _1 1 1 > >>>> 0 0 0 > >>>> 0 0 1 > >>>> 0 1 0 > >>>> 0 1 1 > >>>> > >>>> There's also (* * #:) but that one assumes the antibase2 > >>>> implementation... > >>>> > >> ---------------------------------------------------------------------- > >> For information about J forums see http://www.jsoftware.com/forums.htm > >> > >> ---------------------------------------------------------------------- > >> For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > > > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm