Imaginary base numbers: Difference between revisions
Content added Content deleted
(Added Wren) |
|||
Line 3,295: | Line 3,295: | ||
15i -> 102000.2 -> 15i -15i -> 2010.2 -> -15i |
15i -> 102000.2 -> 15i -15i -> 2010.2 -> -15i |
||
16i -> 102000.0 -> 16i -16i -> 2000.0 -> -16i</pre> |
16i -> 102000.0 -> 16i -16i -> 2000.0 -> -16i</pre> |
||
=={{header|Wren}}== |
|||
{{trans|Go}} |
|||
{{libheader|Wren-complex}} |
|||
{{libheader|Wren-fmt}} |
|||
<lang ecmascript>import "/complex" for Complex |
|||
import "/fmt" for Fmt |
|||
class QuaterImaginary { |
|||
construct new(b2i) { |
|||
if (b2i.type != String || b2i == "" || !b2i.all { |d| "0123.".contains(d) } || |
|||
b2i.count { |d| d == "." } > 1) Fiber.abort("Invalid Base 2i number.") |
|||
_b2i = b2i |
|||
} |
|||
// only works properly if 'c.real' and 'c.imag' are both integral |
|||
static fromComplex(c) { |
|||
if (c.real == 0 && c.imag == 0) return QuaterImaginary.new("0") |
|||
var re = c.real.truncate |
|||
var im = c.imag.truncate |
|||
var fi = -1 |
|||
var sb = "" |
|||
while (re != 0) { |
|||
var rem = re % (-4) |
|||
re = (re/(-4)).truncate |
|||
if (rem < 0) { |
|||
rem = 4 + rem |
|||
re = re + 1 |
|||
} |
|||
if (rem == -0) rem = 0 // get rid of minus zero |
|||
sb = sb + rem.toString + "0" |
|||
} |
|||
if (im != 0) { |
|||
var f = (Complex.new(0, c.imag) / Complex.imagTwo).real |
|||
im = f.ceil |
|||
f = -4 * (f - im) |
|||
var index = 1 |
|||
while (im != 0) { |
|||
var rem = im % (-4) |
|||
im = (im/(-4)).truncate |
|||
if (rem < 0) { |
|||
rem = 4 + rem |
|||
im = im + 1 |
|||
} |
|||
if (index < sb.count) { |
|||
var sbl = sb.toList |
|||
sbl[index] = String.fromByte(rem + 48) |
|||
sb = sbl.join() |
|||
} else { |
|||
if (rem == -0) rem = 0 // get rid of minus zero |
|||
sb = sb + "0" + rem.toString |
|||
} |
|||
index = index + 2 |
|||
} |
|||
fi = f.truncate |
|||
} |
|||
if (sb.count > 0) sb = sb[-1..0] |
|||
if (fi != -1) { |
|||
if (fi == -0) fi = 0 // get rid of minus zero |
|||
sb = sb + ".%(fi)" |
|||
} |
|||
sb = sb.trimStart("0") |
|||
if (sb.startsWith(".")) sb = "0" + sb |
|||
return QuaterImaginary.new(sb) |
|||
} |
|||
toComplex { |
|||
var pointPos = _b2i.indexOf(".") |
|||
var posLen = (pointPos != -1) ? pointPos : _b2i.count |
|||
var sum = Complex.zero |
|||
var prod = Complex.one |
|||
for (j in 0...posLen) { |
|||
var k = _b2i.bytes[posLen-1-j] - 48 |
|||
if (k > 0) sum = sum + prod * k |
|||
prod = prod * Complex.imagTwo |
|||
} |
|||
if (pointPos != -1) { |
|||
prod = Complex.imagTwo.inverse |
|||
var j = posLen + 1 |
|||
while (j < _b2i.count) { |
|||
var k = _b2i.bytes[j] - 48 |
|||
if (k > 0) sum = sum + prod * k |
|||
prod = prod / Complex.imagTwo |
|||
j = j + 1 |
|||
} |
|||
} |
|||
return sum |
|||
} |
|||
toString { _b2i } |
|||
} |
|||
var imagOnly = Fn.new { |c| c.imag.toString + "i" } |
|||
var fmt = "$4s -> $8s -> $4s" |
|||
Complex.showAsReal = true |
|||
for (i in 1..16) { |
|||
var c1 = Complex.new(i, 0) |
|||
var qi = QuaterImaginary.fromComplex(c1) |
|||
var c2 = qi.toComplex |
|||
Fmt.write("%(fmt) ", c1, qi, c2) |
|||
c1 = -c1 |
|||
qi = QuaterImaginary.fromComplex(c1) |
|||
c2 = qi.toComplex |
|||
Fmt.print(fmt, c1, qi, c2) |
|||
} |
|||
System.print() |
|||
for (i in 1..16) { |
|||
var c1 = Complex.new(0, i) |
|||
var qi = QuaterImaginary.fromComplex(c1) |
|||
var c2 = qi.toComplex |
|||
Fmt.write("%(fmt) ", imagOnly.call(c1), qi, imagOnly.call(c2)) |
|||
c1 = -c1 |
|||
qi = QuaterImaginary.fromComplex(c1) |
|||
c2 = qi.toComplex |
|||
Fmt.print(fmt, imagOnly.call(c1), qi, imagOnly.call(c2)) |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
1 -> 1 -> 1 -1 -> 103 -> -1 |
|||
2 -> 2 -> 2 -2 -> 102 -> -2 |
|||
3 -> 3 -> 3 -3 -> 101 -> -3 |
|||
4 -> 10300 -> 4 -4 -> 100 -> -4 |
|||
5 -> 10301 -> 5 -5 -> 203 -> -5 |
|||
6 -> 10302 -> 6 -6 -> 202 -> -6 |
|||
7 -> 10303 -> 7 -7 -> 201 -> -7 |
|||
8 -> 10200 -> 8 -8 -> 200 -> -8 |
|||
9 -> 10201 -> 9 -9 -> 303 -> -9 |
|||
10 -> 10202 -> 10 -10 -> 302 -> -10 |
|||
11 -> 10203 -> 11 -11 -> 301 -> -11 |
|||
12 -> 10100 -> 12 -12 -> 300 -> -12 |
|||
13 -> 10101 -> 13 -13 -> 1030003 -> -13 |
|||
14 -> 10102 -> 14 -14 -> 1030002 -> -14 |
|||
15 -> 10103 -> 15 -15 -> 1030001 -> -15 |
|||
16 -> 10000 -> 16 -16 -> 1030000 -> -16 |
|||
1i -> 10.2 -> 1i -1i -> 0.2 -> -1i |
|||
2i -> 10.0 -> 2i -2i -> 1030.0 -> -2i |
|||
3i -> 20.2 -> 3i -3i -> 1030.2 -> -3i |
|||
4i -> 20.0 -> 4i -4i -> 1020.0 -> -4i |
|||
5i -> 30.2 -> 5i -5i -> 1020.2 -> -5i |
|||
6i -> 30.0 -> 6i -6i -> 1010.0 -> -6i |
|||
7i -> 103000.2 -> 7i -7i -> 1010.2 -> -7i |
|||
8i -> 103000.0 -> 8i -8i -> 1000.0 -> -8i |
|||
9i -> 103010.2 -> 9i -9i -> 1000.2 -> -9i |
|||
10i -> 103010.0 -> 10i -10i -> 2030.0 -> -10i |
|||
11i -> 103020.2 -> 11i -11i -> 2030.2 -> -11i |
|||
12i -> 103020.0 -> 12i -12i -> 2020.0 -> -12i |
|||
13i -> 103030.2 -> 13i -13i -> 2020.2 -> -13i |
|||
14i -> 103030.0 -> 14i -14i -> 2010.0 -> -14i |
|||
15i -> 102000.2 -> 15i -15i -> 2010.2 -> -15i |
|||
16i -> 102000.0 -> 16i -16i -> 2000.0 -> -16i |
|||
</pre> |