Agreed.  What I'm saying is, make the 2's-comp sign bit a _1, and all 
will be well.

    #: _10
0 1 1 0

I didn't know it did that!  That seems wrong:

    #: _10 20
1 0 1 1 0
1 0 1 0 0

Just change the sign of _10 from 1 to _1:

    #. _1 0 1 1 0
_10

The nice thing about this is, you know if a number is negative you have 
to convert it to binary in 2's-complement; and if it has a leading _1 it 
represents a negative; so #. and #: will handle positive and negative 
numbers smoothly, and are compatible with current code except for the 
behavior of #: on negatives, which we agree is anomalous.

And you can do |@:#: if you don't like the negative sign bit.

Still differs from 2&#:, though.

Henry Rich

On 12/12/2011 7:44 PM, Marshall Lochbaum wrote:
> You can't, unfortunately. _10, for example, is #._1 0 1 1 0 , which is the
> shortest possible representation for it. In fact, my code only gives
> adjacent _1 1's on powers of two. In this case it is wrong-- _8 should be
> _1 0 0 , not _1 1 0 0 .
>
> Marshall
>
> On Mon, Dec 12, 2011 at 7:07 PM, Henry Rich<henryhr...@nc.rr.com>  wrote:
>
>> 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
>>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to