I like your leading-digit-negative idea better too. Rather than prepending a leading _1, you could just change the high-order 1 to _1 .
Henry Rich On 12/12/2011 5:57 PM, Marshall Lochbaum wrote: > Those are some very good arguments. Personally, I think my version is > mathematically more well-founded (for instance, when we define the decimal > for a real number, we simply make the first digit an integer and the rest, > those after the decimal place, nonnegative and less than the base). > However, you've convinced me that your version works better within J, at > least for arbitrary use. Within particular applications a user might want > something different, but he can code that himself. > I still wouldn't recommend changing J for that nuance, though. > > I do think that #: for scalar left arguments should act the same as #.^:_1, > rather than | . Some day, when I get that source working, I might look into > that... > > Marshall > > On Mon, Dec 12, 2011 at 5:25 PM, Dan Bron<j...@bron.us> wrote: > >> Raul wrote: >>> And (* * #:@:|) achieves this result. >> >> I used (*@:] * (#.^:_1 |)) because if we're going to change #: , we need a >> consistent definition for all bases. (But I hear your implication that we >> are not going to change #: .) >> >> Oh, and I just realized that my ab1 was not a faithful reproduction of >> Marshall's verb, so in my comments below, substitute his original for ab1 . >> Sorry about that! >> >> -Dan >> >> PS: >> >> Still bugs me that 2 #: y<==> 2 #.^:_1 y doesn't hold non-scalar y . It >> contradicts the dictionary, and makes discussions like this more difficult. >> >> For example, I want to be able to say *@:] * (#: |) is the >> radix-generalized equivalent of your binary * * #:@:| (i.e. the dyad to >> your monad), but it isn't. So I have to use circumlocutions like #.^:_1 >> . >> >> I reported this in 2006; maybe someone who's got the J source to build can >> fix it? >> >> >> http://www.jsoftware.com/jwiki/System/Interpreter/Bugs06#definitionofdyad.23.3Aincomplete >> >> >> >> >> -----Original Message----- >> From: programming-boun...@jsoftware.com [mailto: >> programming-boun...@jsoftware.com] On Behalf Of Raul Miller >> Sent: Monday, December 12, 2011 5:02 PM >> To: Programming forum >> Subject: Re: [Jprogramming] How #: should have been designed >> >> And (* * #:@:|) achieves this result. >> >> #. (* * #:@:|) i: 3 >> _3 _2 _1 0 1 2 3 >> >> That's probably good enough for now. >> >> -- >> Raul >> >> On Mon, Dec 12, 2011 at 4:34 PM, Dan Bron<j...@bron.us> wrote: >>> I don't think there's a violation of a uniqueness constraint. >>> >>> Consider: for a positive scalar argument y, then #:y is unique >> (trivially). >>> And, in the approach we're discussing, when the argument is negative, as >> in >>> #:-y, then the result is just -#:y . Therefore, #:-y is also unique, and >>> furthermore distinct from #:y. That is: the results of #: are always >>> strictly non-positive or non-negative. No individual result of #: will >>> contain both positive and negative digits. >>> >>> I also wouldn't mind your proposal of (#:-y) = _1 , #: y , but I think >> the >>> -#:y approach can claim some advantages. Given: >>> >>> ab0 =: *@:] * (#.^:_1 |) >>> ab1 =: (_1 * 0> ]) ,"0 1^:(0~:+/@:[) #.^:_1 NB. Distilled >> from >>> your code >>> >>> We note first that ab0 is simpler than ab1. That means it's easier to >>> understand and implement (and debug). >>> >>> Second, the results of ab0 are easier to interpret. Knowing the >> definition >>> of both verbs, you could tell me what decimal number _1 _2 _3 represents >> on >>> sight, but with _1 8 7 7 you'd have to do some mental calculation (they >> both >>> represent the quantity _123). This advantage is cumulative when >> reasoning >>> about arrays of results (i.e., in J). >>> >>> Third, critically, the shape of ab0's results doesn't change with the >> sign >>> of its argument. This is important and valuable in a J context. For >>> example: >>> >>> _5 + 6 >>> 1 >>> _5 +&.(2&ab0 :. #.) 6 >>> 1 >>> _5 +&.(2&ab1 :. #.) 6 >>> |length error >>> | _5 +&.(2&ab1 :.#.)6 >>> >>> Moreover, this feature is particularly important for digit-arrays, >> because J >>> pads on the right, but in the positional number system, right-padding is >>> anathema. That is, prepending a _1 exacerbates a problem #: already has >> (by >>> allowing more opportunities for it to arise): >>> >>> my_array =: 2 ab1 3 2 1 >>> my_array =: my_array , 2 ab1 _1 _2 _3 >>> #. my_array >>> 6 4 2 _1 _2 _3 >>> NB. Ouch! Where'd my 3 2 1 go? >>> >>> Finally, I'd argue that the -#:y also makes intuitive sense: _123 means >>> "subtract one hundred, [subtract] two tens, and [subtract] three units". >>> Though this is subjective, it does allow one to reason about negative >>> numbers in a straightforward and expected way: >>> >>> _123 + 456 >>> 333 >>> _1 _2 _3 + 4 5 6 >>> 3 3 3 >>> 10 #. _1 _2 _3 + 4 5 6 >>> 333 >>> >>> _123 * 456 >>> _56088 >>> _1 _2 _3 * 456 >>> _456 _912 _1368 >>> 10 #. _1 _2 _3 * 456 >>> _56088 >>> >>> BTW, though I am using decimal examples, all these comments apply >> equally to >>> binary numbers, and every other base. >>> >>> -Dan >>> >>> -----Original Message----- >>> From: programming-boun...@jsoftware.com >>> [mailto:programming-boun...@jsoftware.com] On Behalf Of Marshall >> Lochbaum >>> Sent: Monday, December 12, 2011 2:55 PM >>> To: Programming forum >>> Subject: Re: [Jprogramming] How #: should have been designed >>> >>> The problem with this is that we would prefer not to use negative numbers >>> in antibase, since they can violate uniqueness of base representation. >>> There's really no solution to this--my recommendation is to just never >> feed >>> negative numbers to #: . However, an option that minimizes negative >> numbers >>> (and is very close to simply having two's complement base representation) >>> is to make the first digit negative if the number is negative. Thus #: >>> becomes >>> base =. [: |."_1@:> |.@(#:`(_1,#:)@.(<&0))&.> >>> Basically, use J's #: , and prepend a _1 if the input is negative. Then >>> reverse, box, open everything for fill, and reverse again. >>> >>> base i:5 >>> _1 0 1 1 >>> _1 1 0 0 >>> 0 _1 0 1 >>> 0 _1 1 0 >>> 0 0 _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 >>> #. base i:5 >>> _5 _4 _3 _2 _1 0 1 2 3 4 5 >>> >>> Marshall >>> >>> On Mon, Dec 12, 2011 at 2:09 PM, Dan Bron<j...@bron.us> wrote: >>> >>>> Maybe we should explore a different track. Forget all about the history >>> of >>>> computing hardware, and the advantages of one representation over >> another >>>> when designing circuits. In purely mathematical terms, what are the >>>> decimal >>>> digits of the base-10 number -123 ? >>>> >>>> Working backwards: >>>> >>>> _123 NB. begin >>>> -123 NB. notation->operation >>>> _1 * 123 NB. definition of - >>>> _1 * (1 * 10^2) + (2 * 10^1) + ( 3 * 10^0) NB. positional number >>>> notation >>>> (_1 * 10^2) + (_2 * 10^1) + (_3 * 10^0) NB. distribution of * >> over >>> + >>>> _1 _2 _3 +/ . * 10^2 1 0 NB. array simplification >>>> 10 #. _1 _2 _3 NB. definition of #. >>>> >>>> Thus, to satisfy the purposes of inversion, we should have: >>>> [all examples from here on are purely theoretical, and the >>>> results differ in the extant implementations of J]: >>>> >>>> 10 #.^:_1: _123 >>>> _1 _2 _3 >>>> >>>> And, analogously in base 2: >>>> >>>> 2 #.^:_1: 2b_101 NB. 2b_101 is J's >> notation >>>> for -101 in base 2 >>>> _1 0 _1 >>>> #: 2b_101 NB. #:<=> 2&#.^:_1: >>>> _1 0 _1 >>>> #: _5 NB. _5<=> 2b_101 >> (numbers >>>> are analytic) >>>> _1 0 _1 >>>> >>>> QED.* >>>> >>>> -Dan >>>> >>>> * Backwards compatibility notwithstanding >>>> >>>> PS: What implications does this have for modulus, as in _10 | 123 ? >>>> >>>> >>>> ---------------------------------------------------------------------- >>>> 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