J: 확장 및 유리수 산술
J: 확장 및 유리수 산술
J 언어의 확장 정밀 정수(extended)와 유리수(rational) 산술을 설명해요. x:, x 접미사, r 분리 표기, 그리고 형 변환 표를 다뤄요.
출처: 문서
본문
확장 정밀 정수 상수는 x로 끝나는 십진 숫자 수열로 입력할 수 있어요. 단항 x:는 정수에 적용되어 확장 정수를 만들어 내요. 예를 들어, 2-요소 벡터 1234x 56x(또는 1234 56x)는 x: 1234 56과 동등해요. 다양한 원시형(primitives)은 인자가 확장이면 확장 결과를 만들어 내요. 어떤 동사 f는 결과가 정수가 아니므로 일부 확장 인자에 부동소수점(부정확) 결과를 만들어 내요. 그러나 <.@f와 >.@f는 확장 정수 인자에 적용되면 확장 정수 결과를 만들어 내요. 확장 정수를 포함하는 비교는 정확해요. 예를 들어:
!40
8.15915e47
!40x
815915283247897734345611269596115894272000000000
*/ x: >: i.40
815915283247897734345611269596115894272000000000
0j_25 ": ! 2000x * i. 5 1 NB. Exponent format, 25 digits
1.0000000000000000000000000e0
3.3162750924506332411753934e5735
1.8288019515140650133147432e12673
2.6839997657267395961163166e20065
5.1841810604808769398058198e27752
] r=: <.@%: 2 * 10 ^ 56x
14142135623730950488016887242
,. *: r + _1 0 1
199999999999999999999999999968972697904100132394908592081
199999999999999999999999999997256969151562033370942366564
200000000000000000000000000025541240399023934346976141049
유리수 상수는 분자와 분모의 십진 숫자로 입력할 수 있으며, r로 구분되고 선택적 부호가 앞에 올 수 있어요. 따라서 3r4는 4분의 3이라는 유리수이고, _12r5는 음의 12 나누기 5예요. 유리수는 표준 형태로 저장되고 표시되는데, 분자와 분모가 서로소(relatively prime)이고 분모가 양수예요. 따라서:
1r2 _1r2 2r4 2r_4 _2r_4 0r9 5 _5
1r2 _1r2 1r2 _1r2 1r2 0 5 _5
다양한 원시 동사는 인자가 유리수이면 (정확한) 유리수 결과를 만들어 내요. 비-유리수 동사는, 그 동사가 유리수 결과를 만드는 유리수 인자를 제한적으로만 가질 경우, 유리수에 적용될 때 (부정확한) 부동소수점 또는 복소수 결과를 만들어 내요. (예를 들어, %:y는 y의 원자가 완전 제곱이면 유리수이고, ^0r1은 부동소수점이에요.) 두 확장 정수의 몫은 (나누어떨어지면) 확장 정수이거나 (그렇지 않으면) 유리수예요. 두 유리수를 포함하는 비교는 정확해요. 인자 형 변환이 필요한 이항 동사(예: + - * % , = <)는 다음 표에 따라 변환해요:
| B I X Q D Z
---+------------------
B | B I X Q D Z B - boolean
I | I I X Q D Z I - integer
X | X X X Q D Z X - extended integer
Q | Q Q Q Q D Z Q - rational
D | D D D D D Z D - floating point
Z | Z Z Z Z Z Z Z - complex
예를 들어, 표현식 2.5+1r2에서 1r2는 2.5에 더해지기 전에 0.5로 변환되어 부동소수점 3이 돼요. 표현식 2+1r2에서 2는 1r2에 더해지기 전에 2r1로 변환되어 5r2가 돼요.
특히, 유리수와 부동소수점 수를 포함하는 비교는 허용적(tolerant)인데, 유리수 인자가 먼저 부동소수점 수로 변환되기 때문이에요.
동사 x:는 유리수가 아닌 인자에 대한 유리수 근사(rational approximations)를 만들어 내요.
2%3
0.666667
2%3x
2r3
(+%)\10$1 NB. Floating point convergents to golden mean
1 2 1.5 1.66667 1.6 1.625 1.61538 1.61905 1.61765 1.61818
(+%)\x: 10$1 NB. Rational versions of same
1 2 3r2 5r3 8r5 13r8 21r13 34r21 55r34 89r55
|: 2 x: (+%)\x: 10$1
1 2 3 5 8 13 21 34 55 89
1 1 2 3 5 8 13 21 34 55
(+%)/ 100$1r1
573147844013817084101r354224848179261915075
0j30 ": (+%)/100$1r1 NB. Display 30 decimal places
1.618033988749894848204586834366
H=: % @: >: @: (+/~) @: i. @ x: NB. Hilbert matrix of order n
] h=: H 6
1 1r2 1r3 1r4 1r5 1r6
1r2 1r3 1r4 1r5 1r6 1r7
1r3 1r4 1r5 1r6 1r7 1r8
1r4 1r5 1r6 1r7 1r8 1r9
1r5 1r6 1r7 1r8 1r9 1r10
1r6 1r7 1r8 1r9 1r10 1r11
-/ .* h NB. Determinant of h
1r186313420339200000
~. q: % -/ .* h NB. Unique prime factors of reciprocal of det
2 3 5 7 11
i.&.(p:^:_1) 2*#h NB. Primes less than 2*n
2 3 5 7 11
^ 2r1 NB. ^y is floating point or complex
7.38906
%: 49r25 NB. %: on a rational perfect square is rational
7r5
%: 49r25 10r9
1.4 1.05409
%: _2r1
0j1.41421
1 = 1+10r1^_15 NB. Exact (rational) comparison
0
(1.5-0.5) = 1+10r1^_15 NB. Tolerant (floating point) comparison
1
0.5 = 1r2
1