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