_ftol()との死闘

 この前の続き。



 結論から言うと、かなり速くなります。

_ftol()の代わりに何をするかと思ったら、

単純に「fistp」を単品で使うようです。*1





 これで万事解決…かと思いきや、

そうは行かない…(汗)

どうもfistp単体だと精度が(結構)甘いようで、

値のブレ具合がヒドイです。

(「3.3505...」になるはずが「3.3563...」とか)

 …んー、1/1000の位あたりから怪しくなってきて、

1/10000あたりからは基本的に当てにならない…かもしれない(汗)

 なので、

精度が欲しい場面では絶対に使ってはいけない。

ただ、本当にかなり速くなるので、

明らかに「小数->整数キャスト」が枷になっている場合

考慮する価値は十分にあると思う。





 …で、さらに調べてみると、

こんなことが書いてあった。



試しに


int _fastcall ftol_quick( double d )
{
int i;
__asm
{
fld d
fistp i;
}
return i;
}


double d = 1.25;
// int i = (int)d;
int i = ftol_quick( d );

こんな感じの使い方を試してみたら、

…本当に早くなった。

……ほんの少しだけど(苦笑)

(1.1倍くらい?…どう甘く見ても1.5倍はない)



 …どれだけ、お節介なんだ…ftol()…。




*1:_ftol()内ではモード切替等をした後fistpを使っているらしいです。
参照元