Skip to content

Instantly share code, notes, and snippets.

@izabera
Last active January 19, 2025 12:53
Show Gist options
  • Save izabera/c6c51447e7b8f2460fbd0221624fa318 to your computer and use it in GitHub Desktop.
Save izabera/c6c51447e7b8f2460fbd0221624fa318 to your computer and use it in GitHub Desktop.
#!/bin/bash
pi=205667
scale=65536
maskf0=-$scale
mask0f=$((scale-1))
shift=16
pisq=42389628127
pi2=411775
pi_2=102944
pi_4=51472
pi3_2=308831
cos () ((REPLY=((pisq-4*$1*$1)*scale)/(pisq+$1*$1)))
sincos1 ()
case $((x=$1,x/pi_2)) in
0) cos "$x" ; cos=$REPLY ; cos "$((pi_2-x))" ; sin=$REPLY ;;
1) cos "$((pi-x))" ; cos=$((-REPLY)); cos "$((x-pi_2))" ; sin=$REPLY ;;
2) cos "$((x-pi))" ; cos=$((-REPLY)); cos "$((pi3_2-x))"; sin=$((-REPLY));;
3) cos "$((x-pi2))"; cos=$REPLY ; cos "$((pi3_2-x))"; sin=$((-REPLY));;
esac
cosine='(pisq-4*y*y)*scale/(pisq+y*y)'
coscalc=(x pi-x x-pi x-pi2 )
sincalc=(pi_2-x x-pi_2 pi3_2-x pi3_2-x)
cosmult=(1 -1 -1 1)
sinmult=(1 1 -1 -1)
sincos2 () ((q=$1/pi_2,x=$1,y=coscalc[q],cos=cosine*cosmult[q],y=sincalc[q],sin=cosine*sinmult[q]))
sincos=(
"y=${coscalc[0]},cos=${cosmult[0]%1}cosine,y=${sincalc[0]},sin=${sinmult[0]%1}cosine"
"y=${coscalc[1]},cos=${cosmult[1]%1}cosine,y=${sincalc[1]},sin=${sinmult[1]%1}cosine"
"y=${coscalc[2]},cos=${cosmult[2]%1}cosine,y=${sincalc[2]},sin=${sinmult[2]%1}cosine"
"y=${coscalc[3]},cos=${cosmult[3]%1}cosine,y=${sincalc[3]},sin=${sinmult[3]%1}cosine"
)
sincos3 () ((x=$1,sincos[$1/pi_2]))
# this is not faster unfortunately
# sincos4 () ((x=$1,sincos[x/pi_2]))
bad=0
for ((i=0;i<pi2;i++)) do
sincos1 "$i"; v1sin=$sin v1cos=$cos
sincos2 "$i"; v2sin=$sin v2cos=$cos
sincos3 "$i"; v3sin=$sin v3cos=$cos
((v1sin==v2sin&&v1cos==v2cos&&v1sin==v3sin&&v1cos==v3cos)) ||
{
((bad++))
printf '%6d - %10d %10d %10d - %10d %10d %10d\n' "$i" "$v1sin" "$v2sin" "$v3sin" "$v1cos" "$v2cos" "$v3cos"
}
done
echo check completed: bad=$bad
TIMEFORMAT=$'real\t%R\tuser\t%U\tsys\t%S'
time for ((i=0;i<pi2;i++)) do sincos1 "$i"; done
time for ((i=0;i<pi2;i++)) do sincos2 "$i"; done
time for ((i=0;i<pi2;i++)) do sincos3 "$i"; done
:
@izabera
Copy link
Author

izabera commented Jan 19, 2025

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment