99 lines
2.2 KiB
Text
99 lines
2.2 KiB
Text
F inv(c)
|
||
V denom = c.real * c.real + c.imag * c.imag
|
||
R Complex(c.real / denom, -c.imag / denom)
|
||
|
||
T QuaterImaginary
|
||
:twoI = Complex(0, 2)
|
||
:invTwoI = inv(.:twoI)
|
||
|
||
String b2i
|
||
|
||
F (str)
|
||
I !re:‘[0123.]+’.match(str) | str.count(‘.’) > 1
|
||
assert(0B, ‘Invalid base 2i number’)
|
||
.b2i = str
|
||
|
||
F toComplex()
|
||
V pointPos = .b2i.findi(‘.’)
|
||
V posLen = I (pointPos < 0) {.b2i.len} E pointPos
|
||
V sum = Complex(0, 0)
|
||
V prod = Complex(1, 0)
|
||
L(j) 0 .< posLen
|
||
V k = Int(.b2i[posLen - 1 - j])
|
||
I k > 0
|
||
sum += prod * k
|
||
prod *= .:twoI
|
||
I pointPos != -1
|
||
prod = .:invTwoI
|
||
L(j) posLen + 1 .< .b2i.len
|
||
V k = Int(.b2i[j])
|
||
I k > 0
|
||
sum += prod * k
|
||
prod *= .:invTwoI
|
||
R sum
|
||
|
||
F String()
|
||
R String(.b2i)
|
||
|
||
F toQuaterImaginary(c)
|
||
I c.real == 0.0 & c.imag == 0.0
|
||
R QuaterImaginary(‘0’)
|
||
|
||
V re = Int(c.real)
|
||
V im = Int(c.imag)
|
||
V fi = -1
|
||
V ss = ‘’
|
||
L re != 0
|
||
(re, V rem) = divmod(re, -4)
|
||
I rem < 0
|
||
rem += 4
|
||
re++
|
||
ss ‘’= String(rem)‘0’
|
||
I im != 0
|
||
V f = c.imag / 2
|
||
im = Int(ceil(f))
|
||
f = -4 * (f - im)
|
||
V index = 1
|
||
L im != 0
|
||
(im, V rem) = divmod(im, -4)
|
||
I rem < 0
|
||
rem += 4
|
||
im++
|
||
I index < ss.len
|
||
assert(0B)
|
||
E
|
||
ss ‘’= ‘0’String(rem)
|
||
index = index + 2
|
||
fi = Int(f)
|
||
ss = reversed(ss)
|
||
I fi != -1
|
||
ss ‘’= ‘.’String(fi)
|
||
ss = ss.ltrim(‘0’)
|
||
I ss[0] == ‘.’
|
||
ss = ‘0’ss
|
||
R QuaterImaginary(ss)
|
||
|
||
L(i) 1..16
|
||
V c1 = Complex(i, 0)
|
||
V qi = toQuaterImaginary(c1)
|
||
V c2 = qi.toComplex()
|
||
print(‘#8 -> #8 -> #8 ’.format(c1, qi, c2), end' ‘ ’)
|
||
|
||
c1 = -c1
|
||
qi = toQuaterImaginary(c1)
|
||
c2 = qi.toComplex()
|
||
print(‘#8 -> #8 -> #8’.format(c1, qi, c2))
|
||
print()
|
||
|
||
L(i) 1..16
|
||
V c1 = Complex(0, i)
|
||
V qi = toQuaterImaginary(c1)
|
||
V c2 = qi.toComplex()
|
||
print(‘#8 -> #8 -> #8 ’.format(c1, qi, c2), end' ‘ ’)
|
||
|
||
c1 = -c1
|
||
qi = toQuaterImaginary(c1)
|
||
c2 = qi.toComplex()
|
||
print(‘#8 -> #8 -> #8’.format(c1, qi, c2))
|
||
|
||
print(‘done’)
|