r7 vs r8
......
15211521
}}}}}}}}}{{{#!if tn="", !br
15221522
{{{#!if tn="...", ts=true
15231523
}}}}}}
1524
##rs 매기기
1525
앞에 매겼던 ac와 bc로 판별식을 만듭니다. i=ac-bc로 둡니다. a의 가장 큰 자리와 b의 가장 큰 자리가 얼마나 차이나는가에 따라 몫에 매기는 소수점 위치가 달라집니다. i>=-35 (ac==-18이고 bc==17일 경우), i<=35 (ac==17이고 bc=-18일 경우)입니다.
1526
{{{#!if i=ac-bc
1527
}}}
1528
a에서 b를 나누면 몫을 10^i 의 자리부터 매기게 됩니다. 소수점 아랫부분까지 몫 기록이 이어지면 상관이 없겠으나, 몫이 소수가 아닌 정수로 기록될 때 실제 자릿수에 해당하는 길이보다 (금방 나누어떨어져) 몫이 짧게 기록되고 그치는 경우 남는 자리에 자동적으로 0을 채워주지 않게 됩니다. 이러면 수동으로 0을 채워주어야 하며, (i==0일 경우 10^0의 자리부터 몫을 기록하므로 10^1과 같거나 큰 자리부터 기록할 경우 곧) i>0일 때에만 의미가 있습니다.
1529
이를테면 4000/2를 계산하는 경우 몫이 "2"까지만 기록되며 뒤에 000은 수동으로 채워주어야 합니다.
1530
{{{#!if i>0
1531
몫은 tm으로 기록되므로 tm의 길이를 따집니다. i가 양수이고 몫이 정수로 나누어떨어질 경우, tm의 길이가 적어도 i+1이 되게 맞춥니다.
1524
##r매기기
1525
{{{#!if i=ac-bc, i>0
15321526
{{{#!if i+1>tm.length
1533
i+1보타 tm의 길이가 작은 경우 i==35인 경우를 감안하여 tm의 뒷부분을 pd+pd --더블 패드--로 채운 다음 i+1길이만큼 오려냅니다.
15341527
{{{#!if tm+=pd+pd, tm=tm.substr(0,i+1)
1535
}}}}}}}}}
1536
1537
i가 18 이상 (18 이상 35 이하)이면 rs를 매길 수 있습니다. 몫을 적어놓은 문자열 tm의 0번 index에 들어가는 문자부터 i에서 18을 뺀 값의 index에 들어가는 문자까지를 rs로 두며, rs의 문자열 길이는 i-18+1 곧 i-17입니다.
1538
{{{#!if i>=18
1539
tm에서 rs를 오려낸 문자열을 tm으로 다시 둡니다.
1528
}}}}}}}}}{{{#!if i>=18
15401529
{{{#!if rs=tm.substr(0,i-17), tm=tm.substr(i-17)
1541
}}}}}}
1542
1543
##ru 매기기
1544
ps를 먼저 false로 초기화한 다음, i>=18 이 되(어 rs를 매기)는 경우 ps를 true로 맞춥니다.
1545
{{{#!if ps=false, i>=18
1530
}}}}}}{{{#!if ps=false, i>=18
15461531
{{{#!if ps=true
1547
}}}}}}
1548
ps가 true이면 문자열 tm에서 18번째 자리까지를 ru로 두고, tm에서 ru를 오려낸 문자열을 tm으로 둡니다.
1549
{{{#!if ps
1532
}}}}}}{{{#!if ps
15501533
{{{#!if ru=tm.substr(0,18), tm=tm.substr(18)
1551
}}}}}}
1552
ps가 false이고 (i가 충분히 큰 값이 아니고) i가 0 이상 (0 이상 17 이하)인 수라면 ru를 매길 수 있으며 문자열의 길이는 i+1이 됩니다.
1553
{{{#!if !ps&&(i>=0)
1534
}}}}}}{{{#!if !ps&&(i>=0)
15541535
{{{#!if ru=tm.substr(0,i+1), tm=tm.substr(i+1)
1555
}}}}}}
1556
1557
##rb 매기기
1558
i>=0이 되(어 ru를 매기)는 경우 ps를 true로 맞춥니다.
1559
{{{#!if i>=0
1536
}}}}}}{{{#!if i>=0
15601537
{{{#!if ps=true
1561
}}}}}}
1562
ps가 true이면 문자열 tm에서 18번째 자리까지를 rb로 두고, tm에서 rb를 오려낸 문자열을 tm으로 둡니다.
1563
{{{#!if ps
1538
}}}}}}{{{#!if ps
15641539
{{{#!if rb=tm.substr(0,18), tm=tm.substr(18)
1565
}}}}}}
1566
ps가 false이고 i가 -18 이상 (-18 이상 -1 이하)이면 rb를 매길 수 있습니다.
1567
이 때 몫으로 문자열의 길이는 i+18+1 곧 i+19가 되며 그 앞부분은 0으로 채워집니다.
1568
몫으로 i+19개의 자리가 채워진다면, 몫 앞을 0으로 채우는 수량은 18에서 i+19를 뺀 -i-1이 됩니다.
1569
이것을 substr을 이용하여 (18자리 문자열인) pd의 substr로 채워보자면
1570
18에서 (-i-1)을 뺀 i+19 번부터 끝까지 해당하는 문자열로 채우면 됩니다.
1571
{{{#!if !ps
1540
}}}}}}{{{#!if !ps
15721541
{{{#!if i>=-18
15731542
{{{#!if rb=tm.substr(0,i+19), tm=tm.substr(i+19), rb=pd.substr(i+19)+rb
1574
}}}}}}
1575
만일 i<0이고 i가 -18보다 작아 rb에 몫을 기록하지 않고 rb보다 더 아래 자리에 기록하게 된다면 rb의 18자리를 모두 0으로 채웁니다.
1576
{{{#!if i<-18
1543
}}}}}}{{{#!if i<-18
15771544
{{{#!if rb=pd
1578
}}}}}}
1579
}}}
1580
1581
##ri 매기기
1582
i>=-18이 되(어 rb를 매기)는 경우 ps를 true로 맞춥니다.
1583
{{{#!if i>=-18
1545
}}}}}}}}}{{{#!if i>=-18
15841546
{{{#!if ps=true
1585
}}}}}}
1586
ps가 true이면 rb와 같은 방법으로 ri를 매기고, tm을 다시 정의합니다.
1587
{{{#!if ps
1547
}}}}}}{{{#!if ps
15881548
{{{#!if ri=tm.substr(0,18), tm=tm.substr(18)
1589
}}}}}}
1590
ps가 false이며 i가 -19 이하 (-36이상 -19 이하이나, i의 최소값은 -35)이면 ri를 매길 수 있습니다. rb와 같습니다.
1591
{{{#!if !ps&&(i>=-36)
1549
}}}}}}{{{#!if !ps&&(i>=-36)
15921550
{{{#!if ri=tm.substr(0,i+37), tm=tm.substr(i+37), ri=pd.substr(i+37)+ri
1593
}}}
1594
}}}
1595
1596
ri까지 몫을 기록했음에도 불구하고 여전히 몫이 남는다면 ... 처리를 하고 ts를 true로 바꿉니다. 단, 나눗셈이 나누어떨어지는 식의 경우 경고 코드 2번을 반환합니다.
1597
{{{#!if tm.length>0
1551
}}}}}}{{{#!if tm.length>0
15981552
{{{#!if tn="...", ts=true, wb=br?2:0
1599
}}}}}}
1600
1601
여기까지가 나눗셈의 계산과정입니다.
1602
}}}
1603
1553
}}}}}}}}}
16041554
##== 계산 결과 표시 정리하기 ==
16051555
##=== 결과값 표시 정리하기 ===
1606
연산이 끝났으면 표기된 숫자를 정리합니다.
1607
1608
##rs, ru 정리 부분
1609
먼저 ru를 (곱셈연산에서 정수값으로 나올 수 있고, 나눗셈에서 몫이 1보다 작은 값이 나오는 경우같이 값을 부여하지 않았다면 초기화할 때 정의했던 정수 0인 채로 있으므로) 문자열로 바꿉니다.
16101556
{{{#!if ru=ru.toString()
1611
}}}
1612
18자리씩 끊어 표기하므로 소수점 위 19~36번째 자리에 해당하는 rs값이 (가령 곱셈에서, 곱한 값을 더한 결과가) 0일 경우 rs를 빈 문자열로 바꿉니다. 이 때 ru를 정수로 바꿔 ru 왼쪽에 있는 0들을 지운 다음, ru를 문자열로 바꿉니다.
1613
{{{#!if +rs==0
1557
}}}{{{#!if +rs==0
16141558
{{{#!if rs="", ru=+ru, ru=ru.toString()
1615
}}}}}}
1616
1617
계산과정에서 ru의 윗자리인 rs값이 0보다 클 경우, 1~18번째 자리인 ru에 빈 자리를 채우도록 ru의 왼쪽을 0으로 채웁니다.
1618
{{{#!if +rs>0
1619
{{{#!if rs=rs.toString(), ru=pd+ru, ru=ru.substr(ru.length-18, 18)
1620
}}}
1621
rs를 정수로 바꿔 rs 앞에 있는 0들을 지운 다음 rs를 문자열로 바꿉니다.
1622
{{{#!if rs=+rs, rs=rs.toString()
1623
}}}}}}
1624
1625
##rb, ri 정리 부분
1626
i보다 소수점 아래부분을 더 써내려가야 하는 상황이 아닌(나눗셈에서 ts가 false인) 경우에서, 소수점 아래 19~36번째 자리에 해당하는 ri값이 0일 경우 ri를 빈 문자열로 바꿉니다.
1627
이 때 ri와 rb가 모두 0일 경우 rb도 빈 문자열로 바꾸고 rp=0으로 둡니다.
1628
{{{#!if !ts
1559
}}}}}}{{{#!if +rs>0
1560
{{{#!if rs=rs.toString(), ru=pd+ru, ru=ru.substr(ru.length-18, 18), rs=+rs, rs=rs.toString()
1561
}}}}}}{{{#!if !ts
16291562
{{{#!if +ri==0
16301563
{{{#!if ri=""
16311564
}}}{{{#!if +rb==0
16321565
{{{#!if rb="", rp=0
1633
}}}}}}}}}}}}
1634
1635
ri가 빈 문자열이 아닐 (+ri가 0보다 클) 때 true를 주는 논리값으로 ps를 정의합니다.
1636
{{{#!if ps=(+ri>0)
1637
}}}
1638
1639
{{{#!if f=="*"
1640
곱셈연산에서 ri가 비어있지 않을 경우 ri와 rb를 문자열로 바꾼 다음 각각 왼쪽을 0으로 채웁니다.
1566
}}}}}}}}}}}}{{{#!if ps=(+ri>0)
1567
}}}{{{#!if f=="*"
16411568
{{{#!if ps
16421569
{{{#!if ri=ri.toString(), ri=pd+ri, ri=ri.substr(ri.length-18, 18), rb=rb.toString(), rb=pd+rb, rb=rb.substr(rb.length-18, 18)
1643
}}}}}}
1644
곱셈연산에서 ri가 비어있으나 rb가 비어있지 않을 경우 rb를 문자열로 바꾼 다음 rb의 왼쪽을 0으로 채웁니다.
1645
{{{#!if !ps&&(+rb>0)
1570
}}}}}}{{{#!if !ps&&(+rb>0)
16461571
{{{#!if rb=rb.toString(), rb=pd+rb, rb=rb.substr(rb.length-18, 18)
1647
}}}}}}
1648
}}}
1649
1650
!ts인 상황에서 ps가 true이면 rp를 ri의 길이로, 그렇지 않고 rb만 0이 아닌경우 rp를 rb의 길이로 정의합니다.
1651
{{{#!if !ts
1572
}}}}}}}}}{{{#!if !ts
16521573
{{{#!if ps
16531574
{{{#!if this.rp=ri.length
1654
}}}
1655
ps가 true일 때 19~36번째 자리인 ri까지 계산하므로 rp에 18을 더해야 하지만, 문자열 정리를 하기 위해 문자열의 index 번호를 다루고자 18을 더하는 작업은 뒤로 뻅니다.
1656
}}}
1657
1658
{{{#!if !ps&&(rb!="")
1575
}}}}}}{{{#!if !ps&&(rb!="")
16591576
{{{#!if this.rp=rb.length
1660
}}}}}}
1661
1662
!ts이면서 ri가 빈 문자열이 아닐 경우 ri의 오른쪽부터 붙은 "0"들을 모두 지웁니다.
1663
{{{#!if ps
1577
}}}}}}{{{#!if ps
16641578
{{{#!if (rp>9)&&(ri.substr(rp-9,9)=="000000000")
16651579
{{{#!if this.ri=ri.substr(0,rp-9), rp-=9
1666
}}}}}}
1667
{{{#!if (rp>4)&&(ri.substr(rp-4,4)=="0000")
1580
}}}}}}{{{#!if (rp>4)&&(ri.substr(rp-4,4)=="0000")
16681581
{{{#!if this.ri=ri.substr(0,rp-4), rp-=4
1669
}}}}}}
1670
{{{#!if (rp>2)&&(ri.substr(rp-2,2)=="00")
1582
}}}}}}{{{#!if (rp>2)&&(ri.substr(rp-2,2)=="00")
16711583
{{{#!if this.ri=ri.substr(0,rp-2), rp-=2
1672
}}}}}}
1673
{{{#!if (rp>2)&&(ri.substr(rp-2,2)=="00")
1584
}}}}}}{{{#!if (rp>2)&&(ri.substr(rp-2,2)=="00")
16741585
{{{#!if this.ri=ri.substr(0,rp-2), rp-=2
1675
}}}}}}
1676
{{{#!if (rp>1)&&(ri.substr(rp-1,1)=="0")
1586
}}}}}}{{{#!if (rp>1)&&(ri.substr(rp-1,1)=="0")
16771587
{{{#!if this.ri=ri.substr(0,rp-1), rp-=1
1678
}}}}}}
1679
문자열 정리를 끝냈을 때 rp에 18을 더합니다.
1680
{{{#!if rp+=18
1681
}}}}}}
1682
1683
!ts이면서 이면서 ri가 빈 문자열일 경우, rb의 오른쪽에 붙은 "0"들을 모두 지웁니다,
1684
{{{#!if !ps
1588
}}}}}}{{{#!if rp+=18
1589
}}}}}}{{{#!if !ps
16851590
{{{#!if (rp>9)&&(rb.substr(rp-9,9)=="000000000")
16861591
{{{#!if this.rb=rb.substr(0,rp-9), rp-=9
1687
}}}}}}
1688
{{{#!if (rp>4)&&(rb.substr(rp-4,4)=="0000")
1592
}}}}}}{{{#!if (rp>4)&&(rb.substr(rp-4,4)=="0000")
16891593
{{{#!if this.rb=rb.substr(0,rp-4), rp-=4
1690
}}}}}}
1691
{{{#!if (rp>2)&&(rb.substr(rp-2,2)=="00")
1594
}}}}}}{{{#!if (rp>2)&&(rb.substr(rp-2,2)=="00")
16921595
{{{#!if this.rb=rb.substr(0,rp-2), rp-=2
1693
}}}}}}
1694
{{{#!if (rp>2)&&(rb.substr(rp-2,2)=="00")
1596
}}}}}}{{{#!if (rp>2)&&(rb.substr(rp-2,2)=="00")
16951597
{{{#!if this.rb=rb.substr(0,rp-2), rp-=2
1696
}}}}}}
1697
{{{#!if (rp>1)&&(rb.substr(rp-1,1)=="0")
1598
}}}}}}{{{#!if (rp>1)&&(rb.substr(rp-1,1)=="0")
16981599
{{{#!if this.rb=rb.substr(0,rp-1), rp-=1
1699
}}}}}}}}}
1700
}}}
1701
1702
ts인 경우 rb, ri의 오른쪽 부분을 정리하지 않고 rp를 39로 정의합니다.
1703
{{{#!if ts
1600
}}}}}}}}}}}}{{{#!if ts
17041601
{{{#!if rp=39
17051602
}}}}}}
1706
1707
1708
1709
rb 정리를 이것으로 종료합니다.
1710
1711
##== 오류 코드 ==
1712
error
1713
1 : 오버플로
1714
2 : 언더플로 (사용하지 않음)
1715
3 : 0으로 나눌 수 없음
1716
4 : 0으로 연산할 수 없음 (사용하지 않음)
1717
5 : 이중 소수점 표기
1718
6 : 소수점 윗부분 오류
1719
7 : 소수점 아랫부분 오류
1720
1721
warning
1722
1 : 소수점 아래 입력한 자릿수가 너무 많음
1723
2 : 소수점 아래 표시하는 자릿수를 제한함 (나눗셈)
1724
3 : 소수점 아래 표시되는 자릿수가 너무 많음 (사용하지 않음)
1725
17261603
##== 아래 출력 변수 설명 ==
17271604
'''sa''' : searching a (logical); '''sb''' : searching b (logical); '''sf''' : searching f (logical);
17281605
'''ps''' : pass (logical);
......
17321609
'''tm''' : temporary string, or transaction message (string); '''tn''' : temporary string 2 (string);
17331610
'''tx''' : temporary value 1 (integer); '''ty''' : temporary value 2 (integer); '''tz''' : temporary value 3 (integer);
17341611
'''comment''' : comment (string);
1735
ru는 계산결과에서 소수점 위 자리이므로, dot(.)이 나오지 않습니다.
17361612
##== 출력 부분 ==
17371613
##=== 계산값 출력 (정상 출력) ===
17381614
}}}{{{#!wiki style="font-weight: 300; font-size: 17.5px;"
......
18321708
}}}}}}.@ms@}}}{{{#!if ps
18331709
)}}} }}}{{{#!if (bs.length>=20)||(as.length+bs.length>=30)
18341710
[br]}}}= @ns@{{{#!if comment="rs 표시 부분", ms=rs, tx=6%(+md), tm="", tn="", (+md==3)||(+md==4)
1835
{{{#!if comment="18자리를 md 자리만큼 떼었을 때 +md==4와 같이 모자라는 자릿수를 tx로 정의합니다.", tn=ms, ty=ms.length, tz=(ty-tx<0)?ty:(ty+tx)%(+md), ty=(ty+tx)/(+md), tz>0
1711
{{{#!if tn=ms, ty=ms.length, tz=(ty-tx<0)?ty:(ty+tx)%(+md), ty=(ty+tx)/(+md), tz>0
18361712
{{{#!if tm+=tn.substr(0,tz), tn=tn.substr(tz), ty>0
18371713
{{{#!if tm+=","
18381714
}}}}}}}}}{{{#!if ty-->0
......
18481724
}}}}}}{{{#!if ty-->0
18491725
{{{#!if tm+=","+tn.substr(0,+md), tn=tn.substr(+md)
18501726
}}}}}}{{{#!if ms=tm
1851
}}}}}}@ms@{{{#!if comment="rs의 값이 존재하고 끊는 단위로 떨어질 때 자릿수 구분 기호인 반점을 새깁니다.", ms=((rs!="")&&(18%(+md)==0))?",":""
1727
}}}}}}@ms@{{{#!if ms=((rs!="")&&(18%(+md)==0))?",":""
18521728
}}}@ms@{{{#!if comment="ru 표시 부분", ms=ru, tm="", tn="", (+md==3)||(+md==4)
18531729
{{{#!if tn=ms, ty=ms.length, tz=ty%(+md), ty=ty/(+md), tz>0
18541730
{{{#!if tm=tn.substr(0,tz), tn=tn.substr(tz)
......
18821758
{{{#!if tm+=" "+tn.substr(0,+md), tn=tn.substr(+md)
18831759
}}}}}}{{{#!if ms=tm
18841760
}}}}}}@ms@{{{#!if ri!=""
1885
{{{#!if comment="ri의 값이 존재하고 끊는 단위로 떨어질 때 자릿수를 매기고자 띄어쓰기를 넣습니다.", ms=(18%(+md)==0)?" ":""
1761
{{{#!if ms=(18%(+md)==0)?" ":""
18861762
}}}@ms@{{{#!if comment="ri 표시 부분", ms=ri, tm="", tn="", (+md==3)||(+md==4)
1887
{{{#!if comment="rs의 경우와 같이, md만큼 떼었을 때 rb에서 모자라는 자릿수를 먼저 끊어 표시합니다.", tn=ms, ty=ms.length, ty=(ty+tx-1)/(+md), tm=(tx>0)?tn.substr(0,tx):tn.substr(0,+md), tn=(tx>0)?tn.substr(tx):tn.substr(+md), ty>0
1763
{{{#!if tn=ms, ty=ms.length, ty=(ty+tx-1)/(+md), tm=(tx>0)?tn.substr(0,tx):tn.substr(0,+md), tn=(tx>0)?tn.substr(tx):tn.substr(+md), ty>0
18881764
{{{#!if tm+=" "
18891765
}}}}}}{{{#!if ty-->0
18901766
{{{#!if tm+=tn.substr(0,+md), tn=tn.substr(+md)
......