CORDIC: Difference between revisions

15,207 bytes removed ,  2 months ago
m
→‎{{header|Phix}}: use pygments
(Added Python implementation for CORDIC task)
m (→‎{{header|Phix}}: use pygments)
 
Line 936:
=={{header|Phix}}==
{{trans|Wren}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<!--</syntaxhighlight>-- lang="phix">
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
with javascript_semantics
<span style="color: #008080;">constant</span> <span style="color: #000000;">angles</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
constant angles = {
<span style="color: #000000;">0.78539816339745</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.46364760900081</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.24497866312686</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.12435499454676</span><span style="color: #0000FF;">,</span>
0.78539816339745, 0.46364760900081, 0.24497866312686, 0.12435499454676,
<span style="color: #000000;">0.06241880999596</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.03123983343027</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.01562372862048</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00781234106010</span><span style="color: #0000FF;">,</span>
0.06241880999596, 0.03123983343027, 0.01562372862048, 0.00781234106010,
<span style="color: #000000;">0.00390623013197</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00195312251648</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00097656218956</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00048828121119</span><span style="color: #0000FF;">,</span>
0.00390623013197, 0.00195312251648, 0.00097656218956, 0.00048828121119,
<span style="color: #000000;">0.00024414062015</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00012207031189</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00006103515617</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00003051757812</span><span style="color: #0000FF;">,</span>
0.00024414062015, 0.00012207031189, 0.00006103515617, 0.00003051757812,
<span style="color: #000000;">0.00001525878906</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00000762939453</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00000381469727</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00000190734863</span><span style="color: #0000FF;">,</span>
0.00001525878906, 0.00000762939453, 0.00000381469727, 0.00000190734863,
<span style="color: #000000;">0.00000095367432</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00000047683716</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00000023841858</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00000011920929</span><span style="color: #0000FF;">,</span>
0.00000095367432, 0.00000047683716, 0.00000023841858, 0.00000011920929,
<span style="color: #000000;">0.00000005960464</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00000002980232</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00000001490116</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.00000000745058</span><span style="color: #0000FF;">}</span>
0.00000005960464, 0.00000002980232, 0.00000001490116, 0.00000000745058}
<span style="color: #008080;">constant</span> <span style="color: #000000;">kvalues</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
constant kvalues = {
<span style="color: #000000;">0.70710678118655</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.63245553203368</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.61357199107790</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60883391251775</span><span style="color: #0000FF;">,</span>
0.70710678118655, 0.63245553203368, 0.61357199107790, 0.60883391251775,
<span style="color: #000000;">0.60764825625617</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60735177014130</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60727764409353</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725911229889</span><span style="color: #0000FF;">,</span>
0.60764825625617, 0.60735177014130, 0.60727764409353, 0.60725911229889,
<span style="color: #000000;">0.60725447933256</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725332108988</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725303152913</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725295913894</span><span style="color: #0000FF;">,</span>
0.60725447933256, 0.60725332108988, 0.60725303152913, 0.60725295913894,
<span style="color: #000000;">0.60725294104140</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725293651701</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725293538591</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725293510314</span><span style="color: #0000FF;">,</span>
0.60725294104140, 0.60725293651701, 0.60725293538591, 0.60725293510314,
<span style="color: #000000;">0.60725293503245</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725293501477</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725293501035</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725293500925</span><span style="color: #0000FF;">,</span>
0.60725293503245, 0.60725293501477, 0.60725293501035, 0.60725293500925,
<span style="color: #000000;">0.60725293500897</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725293500890</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725293500889</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.60725293500888</span><span style="color: #0000FF;">}</span>
0.60725293500897, 0.60725293500890, 0.60725293500889, 0.60725293500888}
 
<span style="color: #008080;">function</span> <span style="color: #000000;">cordic</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">alpha</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
function cordic(atom alpha, integer n)
<span style="color: #004080;">bool</span> <span style="color: #000000;">sgn</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">+</span><span style="color: #000000;">1</span>
bool sgn = +1
<span style="color: #008080;">while</span> <span style="color: #000000;">alpha</span> <span style="color: #0000FF;"><</span> <span style="color: #0000FF;">-</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span> <span style="color: #008080;">do</span> <span style="color: #000000;">alpha</span> <span style="color: #0000FF;">+=</span> <span style="color: #004600;">PI</span> <span style="color: #000000;">sgn</span> <span style="color: #0000FF;">*=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
while alpha < -PI/2 do alpha += PI sgn *= -1 end while
<span style="color: #008080;">while</span> <span style="color: #000000;">alpha</span> <span style="color: #0000FF;">></span> <span style="color: #004600;">PI</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span> <span style="color: #008080;">do</span> <span style="color: #000000;">alpha</span> <span style="color: #0000FF;">-=</span> <span style="color: #004600;">PI</span> <span style="color: #000000;">sgn</span> <span style="color: #0000FF;">*=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
while alpha > PI/2 do alpha -= PI sgn *= -1 end while
<span style="color: #004080;">atom</span> <span style="color: #000000;">kn</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sgn</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">kvalues</span><span style="color: #0000FF;">[</span><span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">kvalues</span><span style="color: #0000FF;">))],</span>
atom kn = sgn * kvalues[min(n,length(kvalues))],
<span style="color: #000000;">atan</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">theta</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pow2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
atan, theta = 0, x = 1, y = 0, pow2 = 1
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
for i=1 to n do
<span style="color: #000000;">atan</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">angles</span><span style="color: #0000FF;">)?</span><span style="color: #000000;">angles</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]:</span><span style="color: #000000;">atan</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
atan = iff(i<=length(angles)?angles[i]:atan/2)
<span style="color: #004080;">atom</span> <span style="color: #000000;">sigma</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">theta</span> <span style="color: #0000FF;"><</span> <span style="color: #000000;">alpha</span> <span style="color: #0000FF;">?</span> <span style="color: #000000;">1</span> <span style="color: #0000FF;">:</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x</span>
<span style="color: #000080;font-style:italic;">-- atom sigma = iff(theta &lt;=< alpha ? 1 : -1), t = x -- (matches Julia)</span>
-- atom sigma = iff(theta <= alpha ? 1 : -1), t = x -- (matches Julia)
<span style="color: #000000;">theta</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">sigma</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">atan</span>
theta += sigma * atan
<span style="color: #000000;">x</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">sigma</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">pow2</span>
x -= sigma * y * pow2
<span style="color: #000000;">y</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">sigma</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">pow2</span>
y += sigma * t * pow2
<span style="color: #000000;">pow2</span> <span style="color: #0000FF;">/=</span> <span style="color: #000000;">2</span>
pow2 /= 2
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">x</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">kn</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">kn</span><span style="color: #0000FF;">}</span>
return {x * kn, y * kn}
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
end function
 
<span style="color: #008080;">constant</span> <span style="color: #000000;">fmh</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"%n x(%s) sin(x) diff.sine cos(x) diff.cosine\n"</span><span style="color: #0000FF;">,</span>
constant fmh = "%n x(%s) sin(x) diff.sine cos(x) diff.cosine\n",
<span style="color: #000000;">fmt</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"%+6.1f %+.8f (%+.8f) %+.8f (%+.8f)\n"</span>
fmt = "%+6.1f %+.8f (%+.8f) %+.8f (%+.8f)\n"
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fmh</span><span style="color: #0000FF;">,{</span><span style="color: #004600;">false</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"deg"</span><span style="color: #0000FF;">})</span>
printf(1,fmh,{false,"deg"})
<span style="color: #008080;">for</span> <span style="color: #000000;">theta</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">90</span> <span style="color: #008080;">to</span> <span style="color: #000000;">90</span> <span style="color: #008080;">by</span> <span style="color: #000000;">15</span> <span style="color: #008080;">do</span>
for theta = -90 to 90 by 15 do
<span style="color: #004080;">atom</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">theta</span><span style="color: #0000FF;">*</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">/</span><span style="color: #000000;">180</span><span style="color: #0000FF;">,</span>
atom r = theta*PI/180,
<span style="color: #0000FF;">{</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cordic</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #000000;">24</span><span style="color: #0000FF;">)</span>
{c,s} = cordic(r,24)
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fmt</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">theta</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">-</span><span style="color: #7060A8;">sin</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">),</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">-</span><span style="color: #7060A8;">cos</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)})</span>
printf(1,fmt,{theta,s,s-sin(r),c,c-cos(r)})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fmh</span><span style="color: #0000FF;">,{</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rad"</span><span style="color: #0000FF;">})</span>
printf(1,fmh,{true,"rad"})
<span style="color: #008080;">for</span> <span style="color: #000000;">r</span> <span style="color: #008080;">in</span> <span style="color: #0000FF;">{-</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">}</span> <span style="color: #008080;">do</span>
for r in {-9, 0, 1.5, 6} do
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cordic</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24</span><span style="color: #0000FF;">)</span>
atom {c,s} = cordic(r, 24)
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fmt</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">-</span><span style="color: #7060A8;">sin</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">),</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">-</span><span style="color: #7060A8;">cos</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)})</span>
printf(1,fmt,{r,s,s-sin(r),c,c-cos(r)})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<!--</syntaxhighlight>-->
</syntaxhighlight>
{{out}}
As noted above in the commented out line, and mentioned in the Wren entry, testing for <= flips the sign of sin(0).
Line 1,010 ⟶ 1,011:
+6.0 -0.27941552 (-0.00000002) +0.96017028 (-0.00000001)
</pre>
 
=={{header|Python}}==
{{trans|C}}
7,820

edits