2010-03-26

浮動小数点数0との乗算の最適化

つい 0*n が 0 に最適化されそうな気がしてしまうけど、されるわけは無いよね。0*NaNはNaN何だし。な、NaNだってー!

うーん、仕方ないなぁ、(C ? C*n : 0)とかなら大丈夫かなぁ。いや、おとなしく個別の関数を用意すべきか……。

結局以下のようなクラステンプレートを作って回避した。

template<int C> struct OptimizedFloatMul { static float mul(float n) { return n * C;}};
template<> struct OptimizedFloatMul<1> { static float mul(float n) { return n;}};
template<> struct OptimizedFloatMul<0> { static float mul(float n) { return 0;}};
template<> struct OptimizedFloatMul<-1> { static float mul(float n) { return -n;}};


template<int PLANE_X, int PLANE_Y, int PLANE_Z, int PLANE_W>
struct HomogeneousClipFuncs
{
    static ElementType dotByPlane(const VectorType &p)
    {
    return OptimizedFloatMul<PLANE_X>::mul(p.x)
        + OptimizedFloatMul<PLANE_Y>::mul(p.y)
        + OptimizedFloatMul<PLANE_Z>::mul(p.z)
        + OptimizedFloatMul<PLANE_W>::mul(p.w);
    }

    struct IsInside
    {
    bool operator()(const PointType &p) const{
        return dotByPlane(VectorType(p)) >= ElementType(0);
    }
    };
...