中間報告
余り手をつけてないけど中間報告。
とりあえず、ベクトルに対するスカラ演算をまとめたりして、若干早くなったけど、その後固定小数関係を書いた。
一応、割り算と掛け算はできたのかな?sqrtも含めて。
で、その後分かったことが、実は何もせずループするだけで、かなり時間がかかるということ。。。
まぁ、もちろん範囲の限定くらいはするけど、ちょっとなぁ・・・
あと、メインループの位置。関数中に埋め込んであったらアラインメントの影響かなにかしらないけど、メインループ処理を関数化して先頭にもっていったら、かなり高速化した。
Cって関数は位置によらずアラインメントしてるのかな?その辺を研究しないと。
あと、変数の使い方の問題もありそうだから、ループはアセンブラでカウンタにレジスタ使って組みなおすつもり。
でも、構造体の扱い方が分からなくて困ってたりする。
コンパイラの出力に頼るのみ。
本日のソース:
とりあえず、その、小数の部分だけ。もっとうまくかけないのかな。
sqrtはネットから適当にピックアップ。たまに無限ループするから(割り算の誤差の問題で)ごまかし入り。
そのうち考え直す。
//小数点の位置 #define FIXPOINT 10000 //浮動小数点数を固定小数点へ。 int fFroat2Fix(float in) { int out; out = (int) in; in -= out; in *= FIXPOINT; out *= FIXPOINT; out += (int) in; return out; } //固定小数点掛け算 int fFixProduct(int a, int b) { //注意! FIXPOINT >= 100 a /= 10; b /= 10; a *= b; a /= FIXPOINT/100; return a; } //固定小数点割り算 int fFixDivision(int a, int b) { int tmp, tmp2 = FIXPOINT; while(((tmp = fProFlow(a, tmp2)) < 0) ){ // printf(" %d,%d - %d,%d ", a, tmp2, tmp, a*tmp2); tmp2 /= 10; if(tmp2 == 0) return a; } // printf("%d,%d,%d - %d,%d \n", a, tmp2, tmp, a*tmp2); b /= tmp2; a = tmp; if(b != 0) a /= b; return a; } //固定小数点sqrt int sqrtFix(int in) { int out = (in + 1*FIXPOINT)/2; int out_tmp, i = 0; while((out != out_tmp)){ if(i<100) out_tmp = out; out = (out + fFixDivision(in, out))/2; i++; } return out; } ;------------------------------ ;CODE SECTION ;------------------------------ section .text USE32 ;GROBAL LABEL global _fProFlow _fProFlow: push ebp mov ebp, esp push edx mov eax, [ebp + 8] mov edx, dword [ebp + 12] imul edx cmp edx, 0 je end mov eax, -1 end: pop edx pop ebp ret