| r7 vs r8 | ||
|---|---|---|
| ... | ... | |
| 1521 | 1521 | }}}}}}}}}{{{#!if tn="", !br |
| 1522 | 1522 | {{{#!if tn="...", ts=true |
| 1523 | 1523 | }}}}}} |
| 1524 | ##r | |
| 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 | |
| 1532 | 1526 | {{{#!if i+1>tm.length |
| 1533 | i+1보타 tm의 길이가 작은 경우 i==35인 경우를 감안하여 tm의 뒷부분을 pd+pd --더블 패드--로 채운 다음 i+1길이만큼 오려냅니다. | |
| 1534 | 1527 | {{{#!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 | |
| 1540 | 1529 | {{{#!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 | |
| 1546 | 1531 | {{{#!if ps=true |
| 1547 | }}}}}} | |
| 1548 | ps가 true이면 문자열 tm에서 18번째 자리까지를 ru로 두고, tm에서 ru를 오려낸 문자열을 tm으로 둡니다. | |
| 1549 | {{{#!if ps | |
| 1532 | }}}}}}{{{#!if ps | |
| 1550 | 1533 | {{{#!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) | |
| 1554 | 1535 | {{{#!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 | |
| 1560 | 1537 | {{{#!if ps=true |
| 1561 | }}}}}} | |
| 1562 | ps가 true이면 문자열 tm에서 18번째 자리까지를 rb로 두고, tm에서 rb를 오려낸 문자열을 tm으로 둡니다. | |
| 1563 | {{{#!if ps | |
| 1538 | }}}}}}{{{#!if ps | |
| 1564 | 1539 | {{{#!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 | |
| 1572 | 1541 | {{{#!if i>=-18 |
| 1573 | 1542 | {{{#!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 | |
| 1577 | 1544 | {{{#!if rb=pd |
| 1578 | }}}}}} | |
| 1579 | }}} | |
| 1580 | ||
| 1581 | ##ri 매기기 | |
| 1582 | i>=-18이 되(어 rb를 매기)는 경우 ps를 true로 맞춥니다. | |
| 1583 | {{{#!if i>=-18 | |
| 1545 | }}}}}}}}}{{{#!if i>=-18 | |
| 1584 | 1546 | {{{#!if ps=true |
| 1585 | }}}}}} | |
| 1586 | ps가 true이면 rb와 같은 방법으로 ri를 매기고, tm을 다시 정의합니다. | |
| 1587 | {{{#!if ps | |
| 1547 | }}}}}}{{{#!if ps | |
| 1588 | 1548 | {{{#!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) | |
| 1592 | 1550 | {{{#!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 | |
| 1598 | 1552 | {{{#!if tn="...", ts=true, wb=br?2:0 |
| 1599 | }}}}}} | |
| 1600 | ||
| 1601 | 여기까지가 나눗셈의 계산과정입니다. | |
| 1602 | }}} | |
| 1603 | ||
| 1553 | }}}}}}}}} | |
| 1604 | 1554 | ##== 계산 결과 표시 정리하기 == |
| 1605 | 1555 | ##=== 결과값 표시 정리하기 === |
| 1606 | 연산이 끝났으면 표기된 숫자를 정리합니다. | |
| 1607 | ||
| 1608 | ##rs, ru 정리 부분 | |
| 1609 | 먼저 ru를 (곱셈연산에서 정수값으로 나올 수 있고, 나눗셈에서 몫이 1보다 작은 값이 나오는 경우같이 값을 부여하지 않았다면 초기화할 때 정의했던 정수 0인 채로 있으므로) 문자열로 바꿉니다. | |
| 1610 | 1556 | {{{#!if ru=ru.toString() |
| 1611 | }}} | |
| 1612 | 18자리씩 끊어 표기하므로 소수점 위 19~36번째 자리에 해당하는 rs값이 (가령 곱셈에서, 곱한 값을 더한 결과가) 0일 경우 rs를 빈 문자열로 바꿉니다. 이 때 ru를 정수로 바꿔 ru 왼쪽에 있는 0들을 지운 다음, ru를 문자열로 바꿉니다. | |
| 1613 | {{{#!if +rs==0 | |
| 1557 | }}}{{{#!if +rs==0 | |
| 1614 | 1558 | {{{#!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 | |
| 1629 | 1562 | {{{#!if +ri==0 |
| 1630 | 1563 | {{{#!if ri="" |
| 1631 | 1564 | }}}{{{#!if +rb==0 |
| 1632 | 1565 | {{{#!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=="*" | |
| 1641 | 1568 | {{{#!if ps |
| 1642 | 1569 | {{{#!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) | |
| 1646 | 1571 | {{{#!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 | |
| 1652 | 1573 | {{{#!if ps |
| 1653 | 1574 | {{{#!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!="") | |
| 1659 | 1576 | {{{#!if this.rp=rb.length |
| 1660 | }}}}}} | |
| 1661 | ||
| 1662 | !ts이면서 ri가 빈 문자열이 아닐 경우 ri의 오른쪽부터 붙은 "0"들을 모두 지웁니다. | |
| 1663 | {{{#!if ps | |
| 1577 | }}}}}}{{{#!if ps | |
| 1664 | 1578 | {{{#!if (rp>9)&&(ri.substr(rp-9,9)=="000000000") |
| 1665 | 1579 | {{{#!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") | |
| 1668 | 1581 | {{{#!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") | |
| 1671 | 1583 | {{{#!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") | |
| 1674 | 1585 | {{{#!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") | |
| 1677 | 1587 | {{{#!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 | |
| 1685 | 1590 | {{{#!if (rp>9)&&(rb.substr(rp-9,9)=="000000000") |
| 1686 | 1591 | {{{#!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") | |
| 1689 | 1593 | {{{#!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") | |
| 1692 | 1595 | {{{#!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") | |
| 1695 | 1597 | {{{#!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") | |
| 1698 | 1599 | {{{#!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 | |
| 1704 | 1601 | {{{#!if rp=39 |
| 1705 | 1602 | }}}}}} |
| 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 | ||
| 1726 | 1603 | ##== 아래 출력 변수 설명 == |
| 1727 | 1604 | '''sa''' : searching a (logical); '''sb''' : searching b (logical); '''sf''' : searching f (logical); |
| 1728 | 1605 | '''ps''' : pass (logical); |
| ... | ... | |
| 1732 | 1609 | '''tm''' : temporary string, or transaction message (string); '''tn''' : temporary string 2 (string); |
| 1733 | 1610 | '''tx''' : temporary value 1 (integer); '''ty''' : temporary value 2 (integer); '''tz''' : temporary value 3 (integer); |
| 1734 | 1611 | '''comment''' : comment (string); |
| 1735 | ru는 계산결과에서 소수점 위 자리이므로, dot(.)이 나오지 않습니다. | |
| 1736 | 1612 | ##== 출력 부분 == |
| 1737 | 1613 | ##=== 계산값 출력 (정상 출력) === |
| 1738 | 1614 | }}}{{{#!wiki style="font-weight: 300; font-size: 17.5px;" |
| ... | ... | |
| 1832 | 1708 | }}}}}}.@ms@}}}{{{#!if ps |
| 1833 | 1709 | )}}} }}}{{{#!if (bs.length>=20)||(as.length+bs.length>=30) |
| 1834 | 1710 | [br]}}}= @ns@{{{#!if comment="rs 표시 부분", ms=rs, tx=6%(+md), tm="", tn="", (+md==3)||(+md==4) |
| 1835 | {{{#!if | |
| 1711 | {{{#!if tn=ms, ty=ms.length, tz=(ty-tx<0)?ty:(ty+tx)%(+md), ty=(ty+tx)/(+md), tz>0 | |
| 1836 | 1712 | {{{#!if tm+=tn.substr(0,tz), tn=tn.substr(tz), ty>0 |
| 1837 | 1713 | {{{#!if tm+="," |
| 1838 | 1714 | }}}}}}}}}{{{#!if ty-->0 |
| ... | ... | |
| 1848 | 1724 | }}}}}}{{{#!if ty-->0 |
| 1849 | 1725 | {{{#!if tm+=","+tn.substr(0,+md), tn=tn.substr(+md) |
| 1850 | 1726 | }}}}}}{{{#!if ms=tm |
| 1851 | }}}}}}@ms@{{{#!if | |
| 1727 | }}}}}}@ms@{{{#!if ms=((rs!="")&&(18%(+md)==0))?",":"" | |
| 1852 | 1728 | }}}@ms@{{{#!if comment="ru 표시 부분", ms=ru, tm="", tn="", (+md==3)||(+md==4) |
| 1853 | 1729 | {{{#!if tn=ms, ty=ms.length, tz=ty%(+md), ty=ty/(+md), tz>0 |
| 1854 | 1730 | {{{#!if tm=tn.substr(0,tz), tn=tn.substr(tz) |
| ... | ... | |
| 1882 | 1758 | {{{#!if tm+=" "+tn.substr(0,+md), tn=tn.substr(+md) |
| 1883 | 1759 | }}}}}}{{{#!if ms=tm |
| 1884 | 1760 | }}}}}}@ms@{{{#!if ri!="" |
| 1885 | {{{#!if | |
| 1761 | {{{#!if ms=(18%(+md)==0)?" ":"" | |
| 1886 | 1762 | }}}@ms@{{{#!if comment="ri 표시 부분", ms=ri, tm="", tn="", (+md==3)||(+md==4) |
| 1887 | {{{#!if | |
| 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 | |
| 1888 | 1764 | {{{#!if tm+=" " |
| 1889 | 1765 | }}}}}}{{{#!if ty-->0 |
| 1890 | 1766 | {{{#!if tm+=tn.substr(0,+md), tn=tn.substr(+md) |
| ... | ... |