#include <cstdio>
#include <cmath>
#include <cstdlib> 
 
//#define USE_DOT
#define USE_SSE
 
 
static const float CMP_EPS = 1e-4f;
static const float NORMALIZE_EPS = 1e-12f;
 
typedef float v4sf __attribute__ ((vector_size (16))); // vector of three single floats
 
struct f3vector {
    union
        {
                v4sf v;
                struct { float x,y,z,w; };
                struct { int ix,iy,iz,iw; };
        };
};
 
 
struct float3 : public f3vector {
        float3() {}
        float3(const float _x, const float _y, const float _z) {
                x = _x; y = _y; z = _z;
        }
 
#ifdef USE_SSE
        float3& operator+= (const float3& f) {
                v += f.v;
                return *this;
        }
#else
        float3& operator+= (const float3& f) {
                x += f.x; y += f.y; z += f.z;
                return *this;
        }
#endif
 
        inline float SqDistance(const float3& f) const {
                const float dx = x - f.x;
                const float dy = y - f.y;
                const float dz = z - f.z;
                return (dx*dx + dy*dy + dz*dz);
        }
 
#ifdef USE_DOT
        bool equals(const float3& f) const {
                return this->SqDistance(f) <= CMP_EPS;
        }
#elif defined(USE_SSE)
        bool equals(float3& f) {
                f3vector n;
                n.v = (v - f.v);
                n.v *= n.v;
                return (n.x + n.y + n.z) <= CMP_EPS;
        }
#else
        bool equals(const float3& f) const {
                return std::fabs(x - f.x) <= CMP_EPS
                        && std::fabs(y - f.y) <= CMP_EPS
                        && std::fabs(z - f.z) <= CMP_EPS;
        }
#endif
};
 
const int count = 100; 
float3 a[count],b[count],c[count],d[count];
 
int main() {
        for(int i=0; i<count; i++) {
                a[i] = float3(0.1f,0.1f,0.1f);
                b[i] = float3(100.1f,100.2f,100.3f);
                c[i] = float3(0.1f,0.2f,0.3f);
                d[i] = float3((float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX);
        }
 
 
        for (int i = 1<<18; i>0; --i) {
                for(int j = 0; j < count; j++) {
                        if (a[j].equals(b[j])) {
                                b[j] += d[j];
                                a[j] = b[j];
                        }
                        a[j] += d[j];
                }
        }
        printf("%f %f %f\n", a[0].x, a[0].y, a[0].z);
 
        return 0;
}