Posit numbers/decoding: Difference between revisions

→‎{{header|Phix}}: Fixed: now matches wp and (most) Julia entires
(→‎{{header|Phix}}: Fixed: now matches wp and (most) Julia entires)
Line 116:
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bits</span><span style="color: #0000FF;">)==</span><span style="color: #000000;">nbits</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">ibits</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">bits</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">bits</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'1'</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span> <span style="color: #008080;">then</span> <span style="color: #000000;">bits</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">twos_compliment_2_on</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bits</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nbits</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">xor_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bits</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">bits</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">b2z</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">bits</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">'0'</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">kexponent</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8000000;">iff0</span><span style="color: #0000FF;">(,</span> <span style="color: #000000;">b2zfraction</span><span style="color: #0000FF;">?-</span><span style="color: #000000;">r</span><span style="color: #0000FF;">:</span><span style="color: #000000;">r</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)0</span>
<span style="color: #008080004080;">ifatom</span> <span style="color: #000000;">rfs</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0useed</span> <span style="color: #0080800000FF;">and=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b2z2</span><span style="color: #0000FF;">,</span><span style="color: #0080807060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">es</span><span style="color: #0000FF;">then))</span>
<span style="color: #008080;">if</span> <span style="color: #008080000000;">ifr</span><span style="color: #0000FF;"><</span><span style="color: #000000;">s0</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">returnif</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">bitsb2z</span><span style="color: #0000FF;">,</span><span style="color: #008000008080;">"NaR"</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- aka infthen</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span> <span style="color: #008080;">then</span>
<span style="color: #000000008080;">fsreturn</span> <span style="color: #0000FF;">={</span> <span style="color: #7060A8000000;">powerbits</span><span style="color: #0000FF;">(,</span><span style="color: #000000008000;">2"NaR"</span><span style="color: #0000FF;">,</span><span style="color: #000000008000;">nbits""</span><span style="color: #0000FF;">-}</span> <span style="color: #000000000080;">efinish</span><span font-style="color: #0000FFitalic;">)-- aka inf</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">efinish</span> <span style="color: #0000FF008080;">=return</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">({</span><span style="color: #000000;">rbits</span><span style="color: #0000FF;">+,</span><span style="color: #000000008000;">2</span><span style="color: #0000FF;zero">+</span><span style="color: #0000000000FF;">es,</span><span style="color: #0000FF008000;">,</span><span style="color: #000000;">nbits</span><span style="color: #0000FF;">),}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080000000;">returnr</span> <span style="color: #0000FF;">{=</span> <span style="color: #000000;">bitsnbits</span><span style="color: #0000FF;">,-</span><span style="color: #008000;">"zero"</span><span style="color: #0000FF000000;">}1</span>
<span style="color: #008080;">else</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">useed</span> <span style="color: #0000FF004080;">=integer</span> <span style="color: #7060A8000000;">powerestart</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2r</span><span style="color: #0000FF;">,+</span><span style="color: #000000;">es3</span><span style="color: #0000FF;">)),</span>
<span style="color: #000000;">fractionefinish</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">to_integermin</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bitsr</span><span style="color: #0000FF;">[+</span><span style="color: #000000;">efinish2</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1es</span><span style="color: #0000FF;">..$],</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2nbits</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">exponent</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">to_integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bits</span><span style="color: #0000FF;">[</span><span style="color: #000000;">estart</span><span style="color: #0000FF;">..</span><span style="color: #000000;">efinish</span><span style="color: #0000FF;">],</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">fraction</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">to_integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bits</span><span style="color: #0000FF;">[</span><span style="color: #000000;">efinish</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$],</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">fs</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nbits</span><span style="color: #0000FF;">-</span><span style="color: #000000;">efinish</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">estartk</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b2z</span><span style="color: #0000FF;">?-</span><span style="color: #000000;">r</span><span style="color: #0000FF;">:</span><span style="color: #000000;">r</span><span style="color: #0000FF;">+-</span><span style="color: #000000;">31</span><span style="color: #0000FF;">,)</span>
<span style="color: #000000;">efinish</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">+</span><span style="color: #000000;">es</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nbits</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">exponent</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">to_integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bits</span><span style="color: #0000FF;">[</span><span style="color: #000000;">estart</span><span style="color: #0000FF;">..</span><span style="color: #000000;">efinish</span><span style="color: #0000FF;">],</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">fraction</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">to_integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bits</span><span style="color: #0000FF;">[</span><span style="color: #000000;">efinish</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$],</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">useed</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">es</span><span style="color: #0000FF;">)),</span>
<span style="color: #000000;">fs</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">nbits</span><span style="color: #0000FF;">-</span><span style="color: #000000;">efinish</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">?-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">:+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)*</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">useed</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">)*</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">exponent</span><span style="color: #0000FF;">)*(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">+</span><span style="color: #000000;">fraction</span><span style="color: #0000FF;">/</span><span style="color: #000000;">fs</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">bitsibits</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
Line 142 ⟶ 148:
<span style="color: #0000FF;">{</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b1001001101011000</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b0000000000000001</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b0111111111111111</span><span style="color: #0000FF;">},</span>
<span style="color: #000080;font-style:italic;">-- {16,0,0b0111111111111111}, -- nope</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b0111111111111111</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b0111111111111110</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b01000000</span><span style="color: #0000FF;">},</span>
Line 149 ⟶ 156:
<span style="color: #0000FF;">{</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b00100000</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b00000001</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b01111111</span><span style="color: #0000FF;">},</span>
<span style="color: #000080;font-style:italic;">-- {8,2,0b01111111}, -- nope</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b01111110</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">32</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b00000000000000000000000000000001</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">32</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b01111111111111111111111111111111</span><span style="color: #0000FF;">},</span>
<span style="color: #000080;font-style:italic;">-- {32,2,0b01111111111111111111111111111111<nowiki>}}</nowiki> -- nope</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">32</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b01111111111111111111111111111110</span><span style="color: #0000FF;">}}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">t</span> <span style="color: #008080;">in</span> <span style="color: #000000;">tests</span> <span style="color: #008080;">do</span>
Line 159 ⟶ 166:
<!--</syntaxhighlight>-->
{{out}}
<small>(Still disagrees with Julia on the -12.65625, but I think I'm right)</small>
Be warned I could not get the largest positive values to match the Wikipedia page... and instead I've put in some bigger values, which are either wrong or prove that table on the wp page is wrong. (As I vaguely understand it, there is only an upper bound for a given es, but a bigger es will always give you a bigger number, at least until something breaks internally.)
<pre>
0000110111011101 = 3.553926944e-6
Line 165 ⟶ 172:
0000000000000000 = "zero"
0110110010101000 = 12.65625
11101100101010001001001101011000 = -12.65625
0000000000000001 = 1.38777878e-17
0111111111111111 = 16384
0111111111111111 = 7.205759404e+16
0111111111111110 = 2.863890392e+250
01000000 = 1
Line 173 ⟶ 182:
00100000 = 0.25
00000001 = 5.960464478e-8
01111111 = 16777216
01111110 = 4.562440618e+192
00000000000000000000000000000001 = 7.523163846e-37
01111111111111111111111111111111 = 1.329227996e+36
01111111111111111111111111111110 = 2.269007734e+279
</pre>
7,805

edits