| r212 vs r213 | ||
|---|---|---|
| ... | ... | |
| 359 | 359 | }}}}}} |
| 360 | 360 | |
| 361 | 361 | {{{#!if f=="/" |
| 362 | 나눗셈은 처음으로 0이 아닌 숫자 | |
| 363 | {{{#!if | |
| 362 | 나눗셈은 소수점 위 18번째 자리부터 내려가면서 처음으로 0이 아닌 숫자가 있으면 그 숫자가 처음 숫자가 되도록 숫자를 왼쪽으로 밀어두려고 합니다. 그 다음 오른쪽을 0으로 채웁니다. | |
| 363 | --앞자리에 0만 여러 개 적어놓고 장난치는 사람이 있을까봐-- au를 값으로 바꾼 다음 다시 문자열로 변환하여 앞자리에 있는 0들을 모두 삭제합니다. bu도 그렇게 둡니다. | |
| 364 | {{{#!if au=+au, au=au.toString(), bu=+bu, bu=bu.toString() | |
| 364 | 365 | }}} |
| 366 | au를 왼쪽으로 밀 경우 남게 되는 자릿수를 변수 tw로 둡니다. (후술할 아래 곱셈연산과 겹치지 않습니다.) | |
| 367 | {{{#!if tw=18-au.length | |
| 368 | ||
| 365 | 369 | }}} |
| 366 | 370 | }}} |
| 371 | }}} | |
| 367 | 372 | 여기까지 곱셈 또는 나눗셈에서 숫자를 초기화하는 과정입니다. |
| 368 | 373 | }}}}}} |
| 369 | 374 | |
| 370 | 375 | a와 b 모두 0이 아닌 경우에서 곱셈을 연산하는 과정입니다. |
| 371 | 376 | {{{#!if (f=="*")&&((+au!=0)||(+ab!=0))&&((+bu!=0)||(+bb!=0)) |
| 372 | 377 | 곱셈은 18자리를 끊어서 계산합니다. 소수점 아래 18자리의 아래인 제19~36번 자리를 ri로 둡니다. 소수점 위 19~36번째 자리는 rs로 두어 ri, rb, ru, rs 순으로 계산합니다. |
| 378 | 소수점 위 18자리, 소수점 아래 18자리인 두 수를 곱하면 해당하는 자리별로 곱셈을 할 때 최대 (18+18)**2=1296회를 곱해야 합니다. | |
| 373 | 379 | |
| 374 | 380 | 앞으로 있을 계산은 다음과 같습니다. |
| 375 | 381 | * ri를 더했더니 ri가 19자리 숫자로 넘치면 넘친 앞의 1자리를 rb로 넘깁니다. |
| ... | ... |