Posit numbers/decoding: Difference between revisions
Content added Content deleted
m (Grondilu moved page Posit numbers to Posit numbers/decoding) |
(→{{header|Wren}}: Made decode function more general.) |
||
Line 70: | Line 70: | ||
=={{header|Wren}}== |
=={{header|Wren}}== |
||
{{libheader|Wren-fmt}} |
{{libheader|Wren-fmt}} |
||
{{libheader|Wren- |
{{libheader|Wren-big}} |
||
<syntaxhighlight lang="ecmascript">import "./fmt" for Conv |
<syntaxhighlight lang="ecmascript">import "./fmt" for Conv |
||
import "./ |
import "./big" for BigRat |
||
var posit16_decode = Fn.new { |ps| |
var posit16_decode = Fn.new { |ps, maxExpSize| |
||
var p = ps.map { |c| c == "0" ? 0 : 1 }.toList |
var p = ps.map { |c| c == "0" ? 0 : 1 }.toList |
||
Line 94: | Line 94: | ||
} |
} |
||
} |
} |
||
var first = p[1] |
var first = p[1] |
||
var rs = |
var rs = 15 // regime size |
||
for (i in 2..15) { |
for (i in 2..15) { |
||
if (p[i] != first) { |
if (p[i] != first) { |
||
Line 104: | Line 103: | ||
} |
} |
||
var regime = p[1..rs] |
var regime = p[1..rs] |
||
var es = |
var es = (rs == 15) ? 0 : maxExpSize.min(14-rs) // actual exponent size |
||
var exponent = [0] |
var exponent = [0] |
||
if (es > 0) exponent = p[rs + 2...rs + 2 + es] |
if (es > 0) exponent = p[rs + 2...rs + 2 + es] |
||
var fs = 14 - rs - es // function size |
var fs = (es == 0) ? 0 : 14 - rs - es // function size |
||
var s = (p[0] == 0) ? 1 : -1 // sign |
var s = (p[0] == 0) ? 1 : -1 // sign |
||
var k = regime.all { |i| i == 0 } ? -rs : rs - 1 |
var k = regime.all { |i| i == 0 } ? -rs : rs - 1 |
||
var u = 2.pow(2.pow( |
var u = 2.pow(2.pow(maxExpSize)) |
||
var e = Conv.atoi(exponent.join(""), 2) |
var e = Conv.atoi(exponent.join(""), 2) |
||
var f = |
var f = BigRat.one |
||
if (fs > 0) { |
if (fs > 0) { |
||
var fraction = ps[-fs..-1] |
var fraction = ps[-fs..-1] |
||
f = Conv.atoi(fraction.join(""), 2) |
f = Conv.atoi(fraction.join(""), 2) |
||
f = |
f = BigRat.one + BigRat.new(f, 2.pow(fs)) |
||
} |
} |
||
return f * |
return f * BigRat.new(u, 1).pow(k) * s * 2.pow(e) |
||
} |
} |
||
var ps = "0000110111011101" |
var ps = "0000110111011101" |
||
System.print(posit16_decode.call(ps))</syntaxhighlight> |
System.print(posit16_decode.call(ps, 3))</syntaxhighlight> |
||
{{out}} |
{{out}} |