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-rat}}
{{libheader|Wren-big}}
<syntaxhighlight lang="ecmascript">import "./fmt" for Conv
<syntaxhighlight lang="ecmascript">import "./fmt" for Conv
import "./rat" for Rat
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 = 1 // regime size
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 = 3.min(14-rs) // exponent size, maximum is 3.
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(es))
var u = 2.pow(2.pow(maxExpSize))
var e = Conv.atoi(exponent.join(""), 2)
var e = Conv.atoi(exponent.join(""), 2)
var f = Rat.zero
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 = Rat.one + Rat.new(f, u)
f = BigRat.one + BigRat.new(f, 2.pow(fs))
}
}
return f * Rat.new(u, 1).pow(k) * s * 2.pow(e)
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}}