Tengo una int a que debe ser igual a «infinito». Esto significa que si

int b = anyValue;

a>b siempre es cierto.

Hay ninguna característica de C++ que podría hacer de esto posible?

  • Usted podría utilizar floats, que tienen un valor que representa el infinito.
  • Así que usted tiene algo similar a lo infinito, a implementar un ejemplo básico del algoritmo de Dijkstra.
  • Bueno, entonces no es una verificación de que el usuario es después, sólo el Max Value aplicación de la lengua.
  • Lo que si b es también infinito?
  • Sí, eso parece, digo yo que cuando me implementar algoritmos de minimización.
  • Ja, me imaginé que iba a implementar Un*. Estaba tan cerca!
  • Si usted necesita valores discretos, float no es la solución. Es fácil imaginar un tipo de datos cuyos valores son -Infinity, INT_MIN, …, 0, …, INT_MAX, +Infinity. C++ no sucede para brindar este tipo.
  • Que tiene sentido. Pensé OP quería realmente realizar el a>b de verificación 🙂
  • C++ es bastante fácil definir una clase con las características requeridas. Para evitar la limitación de los valores reales que puede ser celebrada en el «subyacente» entero, sería necesario mantener un «valor es actualmente el infinito» indicador de estado, y comprobar en el código para reemplazar los operadores de comparación, copiar/add valores, etc. Tendrías que reemplazar una gran cantidad de operadores, pero es todo el movimiento repetitivo de la trivia.
  • y, probablemente, podría afectar significativamente el rendimiento. Recuerdo hadving leer un artículo del año pasado donde el autor se quejó de la falta de +/-inf y NaN para los números enteros que sería tratado por el hardware en lugar de la desagradable subdesbordamiento/desbordamiento de un comportamiento indefinido tenemos por defecto. Ahora, si tan sólo pudiera recordar donde lo leí…
  • M: no me hagas hablar! En el mundo real creo OP petición del orinal. Los físicos teóricos han sido esclavos durante décadas para intentar deshacerse de los infinitos en sus ecuaciones, pero que resulta ser muy duro. Y aquí tenemos a un chico que querían introducir el infinito en la programación – probablemente porque él no sabe cómo, o no puede ser molestado en el diseño de su algoritmo y el código de sensatez en el primer lugar.
  • aún así, no te molesta que std::numeric_limits<int>::min() - 1 == std::numeric_limits<int>::max() en la mayoría de las implementaciones (es técnicamente indefinido) ? Personalmente, me hubiera gustado es igual a std::numeric_limits<int>::minusinfinity() y contaminar el resto de la expresión.
  • Nunca he usado la numeric_limits plantilla, pero tengo en cuenta que es compatible con atributos como pueden apoyar el infinito, y es acotada. Si OP realmente necesita una variable capaz de soportar el infinito que necesitan algo como eso. Pero si en serio pensó que podría conseguir de alguna manera ronda el problema utilizando un estándar de «int», él probablemente estaría fuera de su profundidad con que nivel de abstracción.
  • lo siento necro esto, pero sólo para aclarar ya que tengo un problema similar. Vas a recomendar a resolver esto mediante el uso de a = INT_MAX; derecho? O eres de reffering a una función diferente?
  • No, estoy diciendo que no hay manera de representar el infinito en un tipo entero. Usted podría crear una clase con operadores sobrecargados.

InformationsquelleAutor jozefg | 2011-12-31

6 Comentarios

  1. 113

    Enteros son inherentemente finito. Lo más cerca que se puede llegar es mediante el establecimiento de a a int‘s valor máximo:

    #include <limits>
    
    //...
    
    int a = std::numeric_limits<int>::max();

    Que sería 2^31 - 1 (o 2 147 483 647) si int es de 32 bits de ancho en su implementación.

    Si realmente necesidad de infinito, el uso de un número de punto flotante tipo, como float o double. Usted puede obtener el infinito con:

    double a = std::numeric_limits<double>::infinity();
    • Y si realmente necesidad de infinito como un int, escribir una clase contenedora que las sobrecargas de los operadores de comparación y tiene una variable booleana llamada «is_infinity».
    • Teniendo en cuenta que las necesidades que para que una implementación del algoritmo de Dijkstra, dudo que fueran necesarias. Pero es la más sensata elección de otra manera.
    • He añadido el comentario para futuros visitantes que no implementan el de Dijkstra el algoritmo, pero la necesita para algo más. 🙂
    • Se ve como el que tenemos un candidato para una insignia de oro aquí. 🙂 +1 para los dos!
    • atención a explicar a ti mismo?
    • Tenga en cuenta que si utiliza el int solución, usted debe ser muy cuidadoso con la aritmética: adición de un número positivo a «infinito» dará lugar a una muy inesperado resultado.
    • Clase contenedora sería útil para la comparación de los vectores.
    • Es allí cualquier manera de inicializar con -infinito?
    • Si su aplicación utiliza IEEE 754 de dobles, a continuación, puede utilizar -std::numeric_limits<double>::infinity().

  2. 60

    Enteros son finitos, por lo que lamentablemente no se puede a un verdadero infinito.
    Sin embargo se puede establecer el valor máximo de un int, esto significaría que sería mayor o igual a cualquier otro de tipo int, es decir:

    a>=b

    siempre es cierto.

    Puede hacer esto por

    #include <limits>
    
    //your code here
    
    int a = std::numeric_limits<int>::max();
    
    //go off and lead a happy and productive life

    Esto normalmente será igual a 2.147.483.647

    Si usted realmente necesita un verdadero «infinito» valor», se tendría que usar un doble o un flotador. A continuación, puede simplemente hacer esto

    float a = std::numeric_limits<float>::infinity();

    Explicaciones adicionales de límites numéricos se pueden encontrar aquí

    Feliz Codificación!

    Nota: Como WTP mencionado, si es absolutamente necesario tener un int que es «infinito» tendría que escribir una clase contenedora de un int y la sobrecarga de los operadores de comparación, aunque esto probablemente no es necesario para la mayoría de los proyectos.

    • …y si quieres usar max() o infinity() en una plantilla donde el tipo numérico se desconoce, usted tendrá que utilizar +/-infinity() iff std::numeric_limits<T>::has_infinity y de lo contrario min() y max()
  3. 12

    int es esencialmente finito; no hay ningún valor que satisface sus necesidades.

    Si usted está dispuesto a cambiar el tipo de b, sin embargo, usted puede hacer esto con el operador reemplaza:

    class infinitytype {};
    
    template<typename T>
    bool operator>(const T &, const infinitytype &) {
      return false;
    }
    
    template<typename T>
    bool operator<(const T &, const infinitytype &) {
      return true;
    }
    
    bool operator<(const infinitytype &, const infinitytype &) {
      return false;
    }
    
    
    bool operator>(const infinitytype &, const infinitytype &) {
      return false;
    }
    
    //add operator==, operator!=, operator>=, operator<=...
    
    int main() {
      std::cout << ( INT_MAX < infinitytype() ); //true
    }
    • O… sólo podría utilizar float y std::numeric_limits<float>::infinity().
    • por supuesto, es una opción demasiado 🙂
  4. 3

    Este es un mensaje para mí en el futuro:

    Sólo tiene que utilizar: (unsigned)!((int)0)

    Crea el mayor número posible en cualquier máquina mediante la asignación de todos los bits a 1 (unos) y, a continuación, convierte a unsigned

    Incluso mejor

    #define INF (unsigned)!((int)0)

    Y luego sólo tienes que utilizar INF en el código

    • Creo que te refieres #define INF ((unsigned) ~0), consulte aquí.
  5. -3

    int valores min y max

    Int de-2.147.483.648 /a 2.147.483.647
    Int 64 -9,223,372,036,854,775,808 /9,223,372,036,854,775,807

    supongo que se podría establecer una igualdad de 9,223,372,036,854,775,807 pero tendría que ser una int64

    si siempre desea un ser mayor que b ¿por qué usted necesita para comprobar? sólo tienes que configurar para ser verdad siempre

    • Que depende de la ont la aplicación. No hay un «Int64» en C++ (a menos que cuentes las cosas en C++11 cstdint).
    • para ampliar lo que Etienne dijo, stackoverflow.com/questions/589575/size-of-int-long-etc se explica el significado de int y relacionados con los tipos en C++.
    • Sólo he utilizado embarcadero c++ builder y tiene un __int64, yo no sé de otros c++ no lo tienen así.

Dejar respuesta

Please enter your comment!
Please enter your name here