| r272 vs r273 | ||
|---|---|---|
| ... | ... | |
| 419 | 419 | 곱셈과 나눗셈에서 a와 b 모두 0이 아닌 경우를 봅니다. |
| 420 | 420 | {{{#!if ((+au!=0)||(+ab!=0))&&((+bu!=0)||(+bb!=0)) |
| 421 | 421 | |
| 422 | ##=== | |
| 422 | ##=== 3차 초기화 === | |
| 423 | 423 | {{{#!if f=="*" |
| 424 | 424 | 곱셈계산에서 18자리씩 곱셈을 할 수 있도록 입력했던 a와 b의 문자열을 확장할 것입니다. |
| 425 | 425 | |
| ... | ... | |
| 453 | 453 | 여기까지 곱셈 또는 나눗셈에서 숫자를 초기화하는 과정입니다. |
| 454 | 454 | }}} |
| 455 | 455 | |
| 456 | ##=== 곱셈 === | |
| 456 | 457 | a와 b 모두 0이 아닌 경우에서 곱셈을 연산하는 과정입니다. |
| 457 | 458 | {{{#!if (f=="*")&&((+au!=0)||(+ab!=0))&&((+bu!=0)||(+bb!=0)) |
| 458 | 459 | 곱셈은 18자리를 끊어서 계산합니다. 소수점 아래 18자리의 아래인 제19~36번 자리를 ri로 둡니다. 소수점 위 19~36번째 자리는 rs로 두어 ri, rb, ru, rs 순으로 계산합니다. |
| ... | ... | |
| 5130 | 5131 | |
| 5131 | 5132 | ##rs 매기기 |
| 5132 | 5133 | 앞에 매겼던 ac와 bc로 판별식을 만듭니다. i=ac-bc로 둡니다. a의 가장 큰 자리와 b의 가장 큰 자리가 얼마나 차이나는가에 따라 몫에 매기는 소수점 위치가 달라집니다. i>=-35 (ac==-18이고 bc==17일 경우), i<=35 (ac==17이고 bc=-18일 경우)입니다. |
| 5133 | ||
| 5134 | {{{#!if i=ac-bc | |
| 5135 | }}} | |
| 5136 | ps를 false로 초기화합니다. i가 충분히 큰 값인 상황이면 ps를 true로 바꿉니다. | |
| 5137 | {{{#!if ps=false | |
| 5138 | }}} | |
| 5134 | 5139 | i가 18 이상 (18 이상 35 이하)이면 rs를 매길 수 있습니다. 몫을 적어놓은 문자열 tm의 0번 index에 들어가는 문자부터 i에서 18을 뺀 값의 index에 들어가는 문자까지를 rs로 두며, rs의 문자열 길이는 i-18+1 곧 i-17입니다. |
| 5135 | {{{#!if i | |
| 5140 | {{{#!if i>=18 | |
| 5136 | 5141 | tm에서 rs를 오려낸 문자열을 tm으로 다시 둡니다. |
| 5137 | 5142 | {{{#!if rs=tm.substr(0,i-17), tm=tm.substr(i-17) |
| 5138 | 5143 | }}}}}} |
| 5144 | ||
| 5139 | 5145 | ##ru 매기기 |
| 5140 | i>=18 이 되(어 rs를 매기)는 경우 | |
| 5146 | i>=18 이 되(어 rs를 매기)는 경우 ps를 true로 맞춥니다. | |
| 5141 | 5147 | {{{#!if i>=18 |
| 5142 | {{{#!if | |
| 5148 | {{{#!if ps=true | |
| 5143 | 5149 | }}}}}} |
| 5144 | i가 0 이상 (0 이상 17 이하) | |
| 5145 | {{{#!if i>=0 | |
| 5150 | ps가 true이면 문자열 tm에서 18번째 자리까지를 ru로 두고, tm에서 ru를 오려낸 문자열을 tm으로 둡니다. | |
| 5151 | {{{#!if ps | |
| 5152 | {{{#!if ru=tm.substr(0,18), tm=tm.substr(18) | |
| 5153 | }}}}}} | |
| 5154 | ps가 false이고 (i가 충분히 큰 값이 아니고) i가 0 이상 (0 이상 17 이하)인 수라면 ru를 매길 수 있으며 문자열의 길이는 i+1이 됩니다. | |
| 5155 | {{{#!if !ps&&(i>=0) | |
| 5146 | 5156 | {{{#!if ru=tm.substr(0,i+1), tm=tm.substr(i+1) |
| 5147 | 5157 | }}}}}} |
| 5148 | 5158 | |
| 5149 | 5159 | ##rb 매기기 |
| 5150 | i>=0이 되(어 ru를 매기)는 경우 | |
| 5160 | i>=0이 되(어 ru를 매기)는 경우 ps를 true로 맞춥니다. | |
| 5151 | 5161 | {{{#!if i>=0 |
| 5152 | {{{#!if | |
| 5162 | {{{#!if ps=true | |
| 5153 | 5163 | }}}}}} |
| 5154 | ||
| 5155 | {{{#!if | |
| 5156 | {{{#!if rb=tm.substr(0, | |
| 5164 | ps가 true이면 문자열 tm에서 18번째 자리까지를 rb로 두고, tm에서 rb를 오려낸 문자열을 tm으로 둡니다. | |
| 5165 | {{{#!if ps | |
| 5166 | {{{#!if rb=tm.substr(0,18), tm=tm.substr(18) | |
| 5157 | 5167 | }}}}}} |
| 5168 | ps가 false이고 i가 -18 이상 (-18 이상 -1 이하)이면 rb를 매길 수 있습니다. | |
| 5169 | 이 때 몫으로 문자열의 길이는 i+18+1 곧 i+19가 되며, 그 앞부분은 0으로 채워집니다. | |
| 5170 | {{{#!if !ps&&(i>=-18) | |
| 5171 | {{{#!if rb=tm.substr(0,i+19), tm=tm.substr(i+19), rb=pd+rb, rb=rb.substr(rb.length-18,18) | |
| 5172 | }}}}}} | |
| 5158 | 5173 | |
| 5159 | 5174 | ##ri 매기기 |
| 5160 | i>=-18이 되(어 rb를 매기)는 경우 | |
| 5175 | i>=-18이 되(어 rb를 매기)는 경우 ps를 true로 맞춥니다. | |
| 5161 | 5176 | {{{#!if i>=-18 |
| 5162 | {{{#!if | |
| 5177 | {{{#!if ps=true | |
| 5163 | 5178 | }}}}}} |
| 5164 | ||
| 5165 | {{{#!if | |
| 5166 | ||
| 5167 | {{{#!if ri=tm.substr(0, | |
| 5179 | ps가 true이면 rb와 같은 방법으로 ri를 매기고, tm을 다시 정의합니다. | |
| 5180 | {{{#!if ps | |
| 5181 | {{{#!if ri=tm.substr(0,18), tm=tm.substr(18) | |
| 5168 | 5182 | }}}}}} |
| 5169 | {{{#!if ri=tm.substr(0, | |
| 5170 | }}}}}} | |
| 5183 | ps가 false이며 i가 -19 이하 (-36이상 -19 이하이나, i의 최소값은 -35)이면 ri를 매길 수 있습니다. rb와 같습니다. | |
| 5184 | {{{#!if !ps&&(i>=-36) | |
| 5185 | {{{#!if ri=tm.substr(0,i+37), tm=tm.substr(i+37), ri=pd+ri, ri=ri.substr(ri.length-18,18) | |
| 5186 | }}} | |
| 5187 | }}} | |
| 5188 | ||
| 5171 | 5189 | 여기까지가 나눗셈의 계산과정입니다. |
| 5172 | 5190 | }}} |
| 5173 | 5191 | |
| ... | ... |