So let's go with n+n->n and nxn->2n .

On 12/10/2011 8:35 PM, Henry Rich wrote:
> I think the result should be truncated, so that the nth bit is
> interpreted as a sign bit but might be invalid (I expect this is what
> you meant originally).  With such an operation you would normally use it
> only if you could be sure in advance that no overflow would result.
>
> I don't think that's very useful (though the MH instruction in S\360
> worked that way).  nxn->2n is more useful.
>
> Henry Rich
>
> On 12/10/2011 9:25 PM, Kip Murray wrote:
>> What do you recommend for the high-order bit?  I am "off my reservation"
>> here.  Thought there might be a clever way to add positive numbers using
>> / so partial results could be fun.  Multiplication may be "men dok sai"
>> (too much trouble).
>>
>> On 12/10/2011 8:03 PM, Henry Rich wrote:
>>> Yes, you can do 2's-complement multiplication.  I think you need to be
>>> more precise about what happens in case of overflow: are you just
>>> getting the low n bits of the 2n-bit result, which means that you have a
>>> meaningless sign bit; or is the high-order bit of the product preserved?
>>>
>>> The way you do it in hardware (or microcode, often) is, you implement an
>>> nxn->2n-bit unsigned multiplier, then you correct the product by (for
>>> each operand) subtracting the operand IF the other operand is negative.
>>>      The math of this is fun to work through: in 2's-comp a positive number
>>> is 0.xxxx and a negative code 1.xxxx represents the number (1.xxxx - 2).
>>>      See what that means for products.
>>>
>>> Cheap machines repeatedly add n-bit numbers together, which leads you to
>>> Booth's algorithm (q. v.).
>>>
>>> Now that gates are free the multiplier is implemented with a network of
>>> full adders, which add 3 bits to produce a 2-bit total.  This network is
>>> called a carry-save adder, because the n^2 bits of the partial product
>>> are combined, using full adders, with no explicit carry propagation: you
>>> just keep adding bits of the same place value, reducing the number of
>>> bits by a 3:2 ratio, until you end up with 2n bits, which you then
>>> polish off with a carry-propagating adder (the art of design is in
>>> deciding which bits of equal value should be added).  The overall
>>> operation is surprisingly fast, much faster than adding 64 n-bit numbers
>>> one by one.  Research continues on the best way to build the carry-save
>>> adder, and the building blocks to use for it.
>>>
>>> You could emulate any or all of that, but I'm not sure it's interesting
>>> to do so.
>>>
>>> Henry Rich
>>>
>>> On 12/10/2011 7:48 PM, Kip Murray wrote:
>>>> Cool.  I think it is an improvement because it neatly avoids a case
>>>> statement.  Now I wonder if we could implement two's-complement addition
>>>> and multiplication with overflow, basing these on bitwise operations
>>>>
>>>>         0 + 0 is 0, 0 + 1 is 1 + 0 is 1, and 1 + 1 is 1 0
>>>>
>>>>         0 * 0 is 0 * 1 is 1 * 0 is 0, and 1*1 is 1
>>>>
>>>> That is, I do not want hc and hcinv to be used except to produce data
>>>> and check answers, and I want n-bit two's-complement answers for n-bit
>>>> two's-complement data so some of them will be wrong because of overflow.
>>>>
>>>> Here for Linda is Henry's hcinv expressed without conjunctions other
>>>> than " .
>>>>
>>>>         hcinv =: ([: -/ [: #. (,: [: +: 1 {. ]))"1
>>>>
>>>> On 12/10/2011 10:00 AM, Henry Rich wrote:
>>>>> Same idea, better implementation
>>>>>
>>>>>          hcinv =. -/@:#.@:(,: +:@(1&{.))"1
>>>>>
>>>>> Henry Rich
>>>>>
>>>>> On 12/10/2011 10:48 AM, Henry Rich wrote:
>>>>>> Maybe not an improvement, but this is how I would have done back in my
>>>>>> hardware-design days:
>>>>>>
>>>>>> hcinv =. -~/@:#.@:(~:/\)@:((,1)&,:)"1
>>>>>>
>>>>>> Quite a bit more elegant in wires than in J!
>>>>>>
>>>>>> Henry Rich
>>>>>>
>>>>>> On 12/10/2011 1:01 AM, Kip Murray wrote:
>>>>>>> Now we need an inverse for Raul's improved #: ("hash colon")
>>>>>>>
>>>>>>>             hc  NB. Raul's improved #:
>>>>>>>          {.@#:@(,: (2 * |))
>>>>>>>
>>>>>>>             hc i: 2
>>>>>>>          1 1 0
>>>>>>>          1 1 1
>>>>>>>          0 0 0
>>>>>>>          0 0 1
>>>>>>>          0 1 0
>>>>>>>
>>>>>>>             hcinv  NB. improvement sought
>>>>>>>          2&#.`(2&#.@}. - 2 ^<:@#)@.{."1
>>>>>>>
>>>>>>>             hcinv hc i: 2
>>>>>>>          _2 _1 0 1 2
>>>>>>>
>>>>>>> On 12/8/2011 2:41 PM, Raul Miller wrote:
>>>>>>> ...
>>>>>>> But this would work just as well, as a model:
>>>>>>>
>>>>>>>             {.@#:@(,:  2 * |)i:2
>>>>>>>          1 1 0
>>>>>>>          1 1 1
>>>>>>>          0 0 0
>>>>>>>          0 0 1
>>>>>>>          0 1 0
>>>>>>> ----------------------------------------------------------------------
>>>>>>> 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