-}\r
-\r
-template < typename N, typename E >\r
-number< N, E > operator- (const number< N, E >& n1, const number< N, E >& n2)\r
-{\r
- number< N, E > tmp = n1;\r
- tmp -= n2;\r
- return tmp;\r
-}\r
-\r
-\r
-template < typename N, typename E >\r
-bool number< N, E >::operator< (const number< N, E >& n)\r
-{\r
- number< N, E > n1 = *this;\r
- number< N, E > n2 = n;\r
-\r
- // igualo los largos\r
- n1.normalize_length(n2);\r
- n2.normalize_length(n1);\r
-\r
- // obtengo el largo \r
- size_type length = n1.chunk.size();\r
- size_type i = length - 1;\r
-\r
- // me voy fijando desde "la cifra" más significativa si alguno es menor que el otro\r
- // sigo iterando si son iguales hasta recorrer todo el número hasta la parte menos significativa\r
- while (i > 0)\r
- {\r
- if (n1[i]<n2[i])\r
- return true;\r
- if (n1[i]>n2[i])\r
- return false;\r
-\r
- i--;\r
- }\r
-\r
- // si llegué hasta acá es porque son iguales, por lo tanto no es menor estricto\r
- return false;\r
-\r
-}\r
-
-// efectúa un shifteo a izquierda del chunk, agregando 0s en los casilleros menos significativos
+}
+
+template < typename N, typename E >
+number< N, E > operator- (const number< N, E >& n1, const number< N, E >& n2)
+{
+ number< N, E > tmp = n1;
+ tmp -= n2;
+ return tmp;
+}
+
+
+template < typename N, typename E >
+bool number< N, E >::operator< (const number< N, E >& n) const
+{
+ if (sign != n.sign)
+ {
+ if (sign == positive) // yo positivo, n negativo
+ return false; // yo soy más grande
+ else // yo negagivo, n positivo
+ return true; // n es más grande
+ }
+
+ if (sign == negative) // Si comparamos 2 negativos, usamos
+ return !menorEnModuloQue(n); // "lógica inversa"
+ else
+ return menorEnModuloQue(n);
+}
+
+
+template < typename N, typename E >
+bool number< N, E >::menorEnModuloQue(const number< N, E >& n) const
+{
+ size_type i; //problema de VC++, da error de redefinición
+
+ if (chunk.size() > n.chunk.size()) // yo tengo más elementos
+ {
+ // Recorro los bytes más significativos (que tengo sólo yo)
+ for (i = n.chunk.size(); i < chunk.size(); ++i)
+ {
+ if (chunk[i] != 0) // Si tengo algo distinto a 0
+ {
+ return false; // Entonces soy más grande
+ }
+ }
+ }
+ else if (chunk.size() < n.chunk.size()) // n tiene más elementos
+ {
+ // Recorro los bytes más significativos (que tiene sólo n)
+ for (i = chunk.size(); i < n.chunk.size(); ++i)
+ {
+ if (chunk[i] != 0) // Si n tiene algo distinto a 0
+ {
+ return true; // Entonces soy más chico
+ }
+ }
+ }
+ // sigo con la intersección de ambos
+ size_type fin = std::min(chunk.size(), n.chunk.size());
+ i = fin;
+ while (i != 0) {
+ --i;
+
+ if (chunk[i] < n.chunk[i]) // Si es menor
+ {
+ return true;
+ }
+ else if (chunk[i] > n.chunk[i]) // Si es mayor
+ {
+ return false;
+ }
+ // Si es igual tengo que seguir viendo
+ }
+
+ return false; // Son iguales
+}
+
+
+// efectúa un shifteo a izquierda del chunk, agregando 0s en los casilleros
+// menos significativos