It should also be noted that the epsilon value chosen in the example below is somewhat arbitrary. The value at a absolute maximum should be 1E-6, but it is acceptable for values all the way to 1E-12 (and possibly smaller). Just remember that the whole point of it is to provide a work around for the numerical error the results from storing values in a binary mantissa, with a binary exponent. I don't doubt that there is/are thes(is)/(es) on this subject with a statistical study of what a good epsilon is, but for the purposes of a non-critical 3D application I would say you can just fudge it.

struct Real{

public const float EPSILON = 0.0000001f;

private float number;

public float Value{

get{ return this.number; }

set{ this.number = value; }

}

public Real(float num){

this.number = num;

}

public static bool operator==(Real lhs, Real rhs){

if (Abs(lhs.number - rhs.number) < EPSILON){

return true;

}

return false;

}

// Implement "Equals" if Java or C# using == operator

// ...

public static Real operator/(Real lhs, Real rhs){

ASSERT(Abs(rhs.number) >= EPSILON);

Real result = new Real(lhs.number/rhs.number);

return result;

}

public static Real operator*(Real lhs, Real rhs){

Real result = new Real(lhs*rhs);

return result;

}

// ... all other operators

}