Anonymous user
Long multiplication: Difference between revisions
m
→version 1: added whitespace, used a template for the output sections.
m (→{{header|Phix}}: added syntax colouring the hard way) |
m (→version 1: added whitespace, used a template for the output sections.) |
||
Line 5,267:
numeric digits 300 /*be able to handle gihugeic input #s. */
parse arg x y . /*obtain optional arguments from the CL*/
if x=='' | x=="," then x= 2**64
if y=='' | y=="," then y=
if x<0 && y<0 then sign= '-' /*there only a single negative number? */
else sign= /*no, then result sign must be positive*/
xx=x; x=strip(x, 'T', .); x1= left(x, 1)
yy=y; y=strip(y, 'T', .); y1= left(y, 1)
if x1=='-' | x1=="+" then x= substr(x, 2)
if y1=='-' | y1=="+" then y= substr(y, 2)
parse var x '.' xf;
#= length(xf || yf)
x= space( translate( x, , .), 0)
y= space( translate( y, , .), 0)
Lx= length(x); Ly=length(y)
numeric digits max(digits(), Lx + Ly) /*use a new decimal digits precision.*/
$=
do j=Ly by -1 for Ly /*almost like REXX does it, ··· but no.*/
$= $ + ((x*substr(y, j, 1))copies(0, Ly-j) )
end /*j*/
f= length($) - #
if f<0 then $=copies(0, abs(f) + 1)$ /*Negative? Add leading 0s for INSERT.*/
say 'long mult:' xx "*" yy '──►' sign || strip( insert(., $, length($) - #), 'T', .)
say ' built─in:' xx "*" yy '──►' xx*yy /*stick a fork in it, we're all done. */</lang>
<pre>
long mult: 18446744073709551616 * 18446744073709551616 ──► 340282366920938463463374607431768211456
built─in: 18446744073709551616 * 18446744073709551616 ──► 340282366920938463463374607431768211456
</pre>
<pre>
long mult: 123 * -456789000 ──► -56185047000
built─in: 123 * -456789000 ──► -56185047000
</pre>
<pre>
long mult: -123.678 * +456789000 ──► -56494749942.000
|