Definir y usar infinito negativo en C++

Faiq Bilal 12 octubre 2023
  1. Utilice el producto negativo de numeric_limits::infinity() en C++
  2. Utilice la definición INFINITY de la biblioteca cmath
Definir y usar infinito negativo en C++

Este artículo analiza el problema de representar el infinito negativo en C++ y enumera algunas posibles soluciones.

C++ usa el estándar IEEE-754 para representar los números de coma flotante. Hay tres tipos de datos de coma flotante: flotante, doble y doble largo.

Todos estos tipos de variables permiten el almacenamiento de valores numéricos que no se pueden almacenar en el tipo de datos int.

Infinity se escribe como inf en C++ y da como resultado dividir un valor numérico positivo por un valor nulo o calcular un valor numérico mayor que lo que se puede almacenar en 64 bits.

El valor infinito flotante positivo o sin signo se define en varias bibliotecas de C++, como cmath y limits, pero no existe un estándar para el infinito negativo en C++.

Dado que no existe una forma estándar de representar el infinito negativo en C++, aquí hay varios métodos confiables para representar y usar el infinito negativo en C++.

Utilice el producto negativo de numeric_limits::infinity() en C++

Utilice la biblioteca de límites en C++.

#include <iostream>
#include <limits>

using namespace std;

int main() {
  float f = numeric_limits<float>::infinity();

  float negInf = f * -1;

  cout << "The value of f is = " << f << endl;
  cout << "The value of negInf is = " << negInf << endl;
  cout << "The value of f + negInf is = " << f + negInf << endl;

  return 0;
}

En el fragmento de código anterior, el método infinito de la biblioteca límites devuelve el valor de infinito positivo.

La sintaxis es la siguiente.

numeric_limits<T>::infinity()

En la definición anterior, la T entre corchetes angulares representa la clase de plantilla y, en la implementación real, se reemplaza por el tipo de datos con el que desea utilizar los métodos numeric_limits. En el fragmento de código anterior, se usa el tipo de datos “flotante”, pero “doble” también se puede usar de manera similar.

Sin embargo, el método infinity() solo es válido para tipos de datos no integrales, ya que los tipos de datos integrales como int y bool son inherentemente finitos.

El resultado del código anterior es el siguiente.

The value of f is = inf
The value of negInf is = -inf
The value of f + negInf is = nan

Como se ve en el ejemplo anterior, utilizando el método infinity(), se asigna el valor de infinito positivo a la variable de tipo float f. Luego, se usa un enfoque muy simple e intuitivo, a saber, multiplicar f por -1, y el resultado se almacena en la variable llamada negInf, lo que da como resultado que el valor de infinito negativo se almacene en negInf.

Como se ve en el resultado anterior, este método válido asigna un valor infinito negativo a una variable. Para probar más este método, se suman f y negInf, lo que da como resultado que se devuelva nan, que significa Not-a-Number e indica un valor incalculable.

Este resultado es consistente con las reglas IEEE-754 para valores infinitos y, por lo tanto, computacionalmente seguro.

Utilice la definición INFINITY de la biblioteca cmath

La biblioteca cmath es otra biblioteca de C++ con muchos métodos y funciones útiles para tratar con operaciones y transformaciones matemáticas comunes.

La biblioteca también incluye su definición del valor infinito, que se llama INFINITY y se puede usar de la misma manera que numeric_limits<T>::infinity() y se puede asignar directamente tanto a float como a doble tipos de datos.

Usando el mismo método que en el ejemplo anterior, multiplicar el valor de infinito sin signo o positivo por un valor negativo nos devuelve al valor de infinito negativo.

#include <cmath>
#include <iostream>

using namespace std;

int main() {
  long double f = INFINITY;
  long double negInf = f * -1;

  cout << "The value of f is = " << f << endl;
  cout << "The value of negInf is = " << negInf << endl;

  cout << "The value of f + negInf is = " << f + negInf << endl;
  return 0;
}

El resultado del código anterior es el siguiente.

The value of f is = inf
The value of negInf is = -inf
The value of f + negInf is = nan

Como se puede ver, ambos métodos producen el mismo resultado y ambos se pueden usar de manera segura para implementar el infinito negativo en C++.