#include <string>
#include <stdio.h>
#include <cmath>
#include <assert.h>
#include <vector>
#include <stdlib.h>
#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(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
};
int main() {
float3 a(0.1f,0.1f,0.1f);
float3 b(100.1f,100.2f,100.3f);
float3 c(0.1f,0.2f,0.3f);
float3 d((float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX);
for (int i = 1<<27; i>0; --i) {
if (a.equals(b)) {
b += d;
a = b;
}
a += d;
}
/*for (int i = 1<<27; i>0; --i) {
if (a.equals(b)) {
b += a;
a += c;
}
a += c;
}*/
printf("%f %f %f\n", a.x, a.y, a.z);
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIFVTRV9ET1QKLy8jZGVmaW5lIFVTRV9TU0UKCgpzdGF0aWMgY29uc3QgZmxvYXQgQ01QX0VQUyA9IDFlLTRmOwpzdGF0aWMgY29uc3QgZmxvYXQgTk9STUFMSVpFX0VQUyA9IDFlLTEyZjsKCnR5cGVkZWYgZmxvYXQgdjRzZiBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpOyAvLyB2ZWN0b3Igb2YgdGhyZWUgc2luZ2xlIGZsb2F0cwoKc3RydWN0IGYzdmVjdG9yIHsKICAgIHVuaW9uCgl7CgkJdjRzZiB2OwoJCXN0cnVjdCB7IGZsb2F0IHgseSx6LHc7IH07CgkJc3RydWN0IHsgaW50IGl4LGl5LGl6LGl3OyB9OwoJfTsKfTsKCgpzdHJ1Y3QgZmxvYXQzIDogcHVibGljIGYzdmVjdG9yIHsKCWZsb2F0Myhjb25zdCBmbG9hdCBfeCwgY29uc3QgZmxvYXQgX3ksIGNvbnN0IGZsb2F0IF96KSB7CgkJeCA9IF94OyB5ID0gX3k7IHogPSBfejsKCX0KCiNpZmRlZiBVU0VfU1NFCglmbG9hdDMmIG9wZXJhdG9yKz0gKGNvbnN0IGZsb2F0MyYgZikgewoJCXYgKz0gZi52OwoJCXJldHVybiAqdGhpczsKCX0KI2Vsc2UKCWZsb2F0MyYgb3BlcmF0b3IrPSAoY29uc3QgZmxvYXQzJiBmKSB7CgkJeCArPSBmLng7IHkgKz0gZi55OyB6ICs9IGYuejsKCQlyZXR1cm4gKnRoaXM7Cgl9CiNlbmRpZgoKICAgICAgICBpbmxpbmUgZmxvYXQgU3FEaXN0YW5jZShjb25zdCBmbG9hdDMmIGYpIGNvbnN0IHsKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGR4ID0geCAtIGYueDsKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGR5ID0geSAtIGYueTsKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGR6ID0geiAtIGYuejsKICAgICAgICAgICAgICAgIHJldHVybiAoZHgqZHggKyBkeSpkeSArIGR6KmR6KTsKICAgICAgICB9CgojaWZkZWYgVVNFX0RPVAoJYm9vbCBlcXVhbHMoY29uc3QgZmxvYXQzJiBmKSBjb25zdCB7CgkJcmV0dXJuIHRoaXMtPlNxRGlzdGFuY2UoZikgPD0gQ01QX0VQUzsKCX0KI2VsaWYgZGVmaW5lZChVU0VfU1NFKQoJYm9vbCBlcXVhbHMoZmxvYXQzJiBmKSB7CgkJZjN2ZWN0b3IgbjsKCQluLnYgPSAodiAtIGYudik7CgkJbi52ICo9IG4udjsKCQlyZXR1cm4gKG4ueCArIG4ueSArIG4ueikgPD0gQ01QX0VQUzsKCX0KI2Vsc2UKICAgICAgICBib29sIGVxdWFscyhjb25zdCBmbG9hdDMmIGYpIGNvbnN0IHsKICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmZhYnMoeCAtIGYueCkgPD0gQ01QX0VQUwogICAgICAgICAgICAgICAgICAgICAgICAmJiBzdGQ6OmZhYnMoeSAtIGYueSkgPD0gQ01QX0VQUwogICAgICAgICAgICAgICAgICAgICAgICAmJiBzdGQ6OmZhYnMoeiAtIGYueikgPD0gQ01QX0VQUzsKICAgICAgICB9CiNlbmRpZgp9OwoKCmludCBtYWluKCkgewogICAgICAgIGZsb2F0MyBhKDAuMWYsMC4xZiwwLjFmKTsKICAgICAgICBmbG9hdDMgYigxMDAuMWYsMTAwLjJmLDEwMC4zZik7CglmbG9hdDMgYygwLjFmLDAuMmYsMC4zZik7CglmbG9hdDMgZCgoZmxvYXQpcmFuZCgpLyhmbG9hdClSQU5EX01BWCwgKGZsb2F0KXJhbmQoKS8oZmxvYXQpUkFORF9NQVgsIChmbG9hdClyYW5kKCkvKGZsb2F0KVJBTkRfTUFYKTsKICAgICAgICBmb3IgKGludCBpID0gMTw8Mjc7IGk+MDsgLS1pKSB7CiAgICAgICAgICAgICAgICBpZiAoYS5lcXVhbHMoYikpIHsKCQkJYiArPSBkOwogICAgICAgICAgICAgICAgICAgICAgICBhID0gYjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEgKz0gZDsKICAgICAgICB9CgkvKmZvciAoaW50IGkgPSAxPDwyNzsgaT4wOyAtLWkpIHsKCQlpZiAoYS5lcXVhbHMoYikpIHsKCQkJYiArPSBhOwoJCQlhICs9IGM7CgkJfQoJCWEgKz0gYzsKICAgICAgICB9Ki8KICAgICAgICBwcmludGYoIiVmICVmICVmXG4iLCBhLngsIGEueSwgYS56KTsKIAogICAgICAgIHJldHVybiAwOwp9