Posit numbers/decoding: Difference between revisions

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

edits