#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;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3N0ZGxpYj4gCiAKLy8jZGVmaW5lIFVTRV9ET1QKI2RlZmluZSBVU0VfU1NFCiAKIApzdGF0aWMgY29uc3QgZmxvYXQgQ01QX0VQUyA9IDFlLTRmOwpzdGF0aWMgY29uc3QgZmxvYXQgTk9STUFMSVpFX0VQUyA9IDFlLTEyZjsKIAp0eXBlZGVmIGZsb2F0IHY0c2YgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICgxNikpKTsgLy8gdmVjdG9yIG9mIHRocmVlIHNpbmdsZSBmbG9hdHMKIApzdHJ1Y3QgZjN2ZWN0b3IgewogICAgdW5pb24KICAgICAgICB7CiAgICAgICAgICAgICAgICB2NHNmIHY7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgeyBmbG9hdCB4LHkseix3OyB9OwogICAgICAgICAgICAgICAgc3RydWN0IHsgaW50IGl4LGl5LGl6LGl3OyB9OwogICAgICAgIH07Cn07CiAKIApzdHJ1Y3QgZmxvYXQzIDogcHVibGljIGYzdmVjdG9yIHsKICAgICAgICBmbG9hdDMoKSB7fQogICAgICAgIGZsb2F0Myhjb25zdCBmbG9hdCBfeCwgY29uc3QgZmxvYXQgX3ksIGNvbnN0IGZsb2F0IF96KSB7CiAgICAgICAgICAgICAgICB4ID0gX3g7IHkgPSBfeTsgeiA9IF96OwogICAgICAgIH0KIAojaWZkZWYgVVNFX1NTRQogICAgICAgIGZsb2F0MyYgb3BlcmF0b3IrPSAoY29uc3QgZmxvYXQzJiBmKSB7CiAgICAgICAgICAgICAgICB2ICs9IGYudjsKICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKICAgICAgICB9CiNlbHNlCiAgICAgICAgZmxvYXQzJiBvcGVyYXRvcis9IChjb25zdCBmbG9hdDMmIGYpIHsKICAgICAgICAgICAgICAgIHggKz0gZi54OyB5ICs9IGYueTsgeiArPSBmLno7CiAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgICAgfQojZW5kaWYKIAogICAgICAgIGlubGluZSBmbG9hdCBTcURpc3RhbmNlKGNvbnN0IGZsb2F0MyYgZikgY29uc3QgewogICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgZHggPSB4IC0gZi54OwogICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgZHkgPSB5IC0gZi55OwogICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgZHogPSB6IC0gZi56OwogICAgICAgICAgICAgICAgcmV0dXJuIChkeCpkeCArIGR5KmR5ICsgZHoqZHopOwogICAgICAgIH0KIAojaWZkZWYgVVNFX0RPVAogICAgICAgIGJvb2wgZXF1YWxzKGNvbnN0IGZsb2F0MyYgZikgY29uc3QgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPlNxRGlzdGFuY2UoZikgPD0gQ01QX0VQUzsKICAgICAgICB9CiNlbGlmIGRlZmluZWQoVVNFX1NTRSkKICAgICAgICBib29sIGVxdWFscyhmbG9hdDMmIGYpIHsKICAgICAgICAgICAgICAgIGYzdmVjdG9yIG47CiAgICAgICAgICAgICAgICBuLnYgPSAodiAtIGYudik7CiAgICAgICAgICAgICAgICBuLnYgKj0gbi52OwogICAgICAgICAgICAgICAgcmV0dXJuIChuLnggKyBuLnkgKyBuLnopIDw9IENNUF9FUFM7CiAgICAgICAgfQojZWxzZQogICAgICAgIGJvb2wgZXF1YWxzKGNvbnN0IGZsb2F0MyYgZikgY29uc3QgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmFicyh4IC0gZi54KSA8PSBDTVBfRVBTCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0ZDo6ZmFicyh5IC0gZi55KSA8PSBDTVBfRVBTCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0ZDo6ZmFicyh6IC0gZi56KSA8PSBDTVBfRVBTOwogICAgICAgIH0KI2VuZGlmCn07CiAKY29uc3QgaW50IGNvdW50ID0gMTAwOyAKZmxvYXQzIGFbY291bnRdLGJbY291bnRdLGNbY291bnRdLGRbY291bnRdOwogCmludCBtYWluKCkgewogICAgICAgIGZvcihpbnQgaT0wOyBpPGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgIGFbaV0gPSBmbG9hdDMoMC4xZiwwLjFmLDAuMWYpOwogICAgICAgICAgICAgICAgYltpXSA9IGZsb2F0MygxMDAuMWYsMTAwLjJmLDEwMC4zZik7CiAgICAgICAgICAgICAgICBjW2ldID0gZmxvYXQzKDAuMWYsMC4yZiwwLjNmKTsKICAgICAgICAgICAgICAgIGRbaV0gPSBmbG9hdDMoKGZsb2F0KXJhbmQoKS8oZmxvYXQpUkFORF9NQVgsIChmbG9hdClyYW5kKCkvKGZsb2F0KVJBTkRfTUFYLCAoZmxvYXQpcmFuZCgpLyhmbG9hdClSQU5EX01BWCk7CiAgICAgICAgfQogCiAKICAgICAgICBmb3IgKGludCBpID0gMTw8MTg7IGk+MDsgLS1pKSB7CiAgICAgICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVtqXS5lcXVhbHMoYltqXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiW2pdICs9IGRbal07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtqXSA9IGJbal07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYVtqXSArPSBkW2pdOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcmludGYoIiVmICVmICVmXG4iLCBhWzBdLngsIGFbMF0ueSwgYVswXS56KTsKIAogICAgICAgIHJldHVybiAwOwp9