><https://twitter.com/orange_in_spacehttps://pawoo.net/@orange_in_space
CILで書いたサイン計算自作のやつ(?)gistに置いた><
Calculate sine written in CIL practice(CIL/MSILで自前でサインを計算する練習コード><)https://gist.github.com/orange-in-space/479c525c7f5196857e4c57a0a69fbb78
Sin(6.28)だと-0.0176759863031667(><)-0.00318530179(Google)で、やっぱ大きい数値だと全然ダメ><;
Sin(1.23456) で試すと0.94400312183479(オレンジ手作りCIL版)0.94400312183 (Google電卓)で、小さい数値であれば精度十分><;
int32部分をint64に変えて、10段階(3~21)にしてSin(4.2)したら-0.871578887607713になった><-0.87157577241(Google電卓)と比較すると小数点以下5桁まであってる?><
同じことをx86(386(387)/AMD64)のアセンブラで出来たらもっと楽しそう><
精度はへなちょこだけど、CPU/FPUの専用命令にも標準ライブラリの出来合いの完成品の関数にも頼らずに三角関数計算出来ちゃった><
なんか、C#で実装した時と結果的に同じものが出来てるけど、CILで全部自前で書くと、満足感が全然違うというか「一応ちゃんと自分で作れた!><;」感がすごい><
11まで増やしたら(テイラー展開5段?)、Sin(4.2)が、 -0.890295694927415 になった><Google電卓では、-0.87157577241なのでだいぶ違う><;
C#版も同じ数字になったからバグってないっぽい!!!!!><
C#版で試して同じか見てみればいいのか・・・><
この段階で、Sin(4.2)をしたら-1.83125712って返ってきたけど、もちろん精度とても低いけどこの時点ではバグってるんだろうかバグってないんだろうか?><;
こんな風に増やしていけばおk?><;
コードはこんな感じ><(PowとFactorialの中身はさっき貼ったスクショを見てほしい><)
CILで自前でサイン計算するやつ一応出来た!!!><(まだ1段階(?)しかテイラー展開してないので、小さい数値限定だけど><;)
ちょっと不格好だけどCILで階乗書けた><;
コンパイルして中身見るようなズルをせずに直接CILで記述することに意義がある><(実用性は全く無い)
あとは、整数の階乗も書けば、ほぼ三角関数自前計算が出来るはず・・・><
なんか無駄がある気がするけど、一応Pow(double x, int y)をCILで書けた><;
・・・よく考えたら、テイラー展開の為であれば、実数乗は不要?><;
CPUやFPUがやってくれてる事をわざわざ自分で実装しようとすると、ものすごく数学の知識が要求されるんだってあらためて痛感><;
思考の /dev/null