Definieren und verwenden Sie negative Unendlichkeit in C++

Faiq Bilal 12 Oktober 2023
  1. Verwenden Sie das negative Produkt von numeric_limits::infinity() in C++
  2. Verwenden Sie die INFINITY-Definition aus der cmath-Bibliothek
Definieren und verwenden Sie negative Unendlichkeit in C++

Dieser Artikel behandelt das Problem der Darstellung negativer Unendlichkeit in C++ und listet einige mögliche Lösungen auf.

C++ verwendet den IEEE-754-Standard, um die Gleitkommazahlen darzustellen. Es gibt drei Gleitkommadatentypen: float, double und long double.

Alle diese Variablentypen erlauben die Speicherung von Zahlenwerten, die nicht im Datentyp int gespeichert werden können.

Infinity wird in C++ als inf geschrieben und resultiert in der Division eines positiven numerischen Werts durch einen Nullwert oder in der Berechnung eines numerischen Werts, der größer ist als das, was in 64 Bit gespeichert werden kann.

Der vorzeichenlose oder positiv fließende Unendlichkeitswert ist in verschiedenen C++-Bibliotheken wie cmath und limits definiert, aber es gibt keinen Standard für negative Unendlichkeit in C++.

Da es in C++ keine Standardmethode zur Darstellung von negativer Unendlichkeit gibt, finden Sie hier einige zuverlässige Methoden zur Darstellung und Verwendung von negativer Unendlichkeit in C++.

Verwenden Sie das negative Produkt von numeric_limits::infinity() in C++

Verwenden Sie die Bibliothek limits in 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;
}

Im obigen Codeausschnitt gibt die Methode infinity aus der Bibliothek limits den Wert positiv unendlich zurück.

Die Syntax ist wie folgt.

numeric_limits<T>::infinity()

In der obigen Definition steht das T zwischen den spitzen Klammern für Template-Klasse und wird in der konkreten Implementierung durch den Datentyp ersetzt, mit dem Sie die numeric_limits-Methoden verwenden wollen. Im obigen Code-Snippet wird der Datentyp float verwendet, aber double kann auch ähnlich verwendet werden.

Die Methode infinity() ist jedoch nur für nicht ganzzahlige Datentypen gültig, da ganzzahlige Datentypen wie int und bool von Natur aus endlich sind.

Die Ausgabe für den obigen Code lautet wie folgt.

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

Wie im obigen Beispiel zu sehen ist, wird bei Verwendung der Methode infinity() der Variable f vom Typ float der Wert positiv unendlich zugewiesen. Dann wird ein sehr einfacher und intuitiver Ansatz verwendet, nämlich f mit -1 zu multiplizieren, und das Ergebnis wird in der Variablen namens negInf gespeichert, was dazu führt, dass der Wert von minus unendlich in negInf gespeichert wird.

Wie in der obigen Ausgabe zu sehen ist, weist diese gültige Methode einer Variablen einen negativen Unendlichkeitswert zu. Um diese Methode weiter zu testen, werden f und negInf addiert, wodurch nan zurückgegeben wird, was für Not-a-Number steht und einen unkalkulierbaren Wert anzeigt.

Dieses Ergebnis stimmt mit den IEEE-754-Regeln für unendliche Werte überein und ist daher rechnerisch sicher.

Verwenden Sie die INFINITY-Definition aus der cmath-Bibliothek

Die cmath-Bibliothek ist eine weitere C++-Bibliothek mit vielen nützlichen Methoden und Funktionen, um mit gängigen mathematischen Operationen und Transformationen umzugehen.

Die Bibliothek enthält auch ihre Definition des unendlichen Werts, der INFINITY genannt wird und ähnlich wie numeric_limits<T>::infinity() verwendet werden kann und sowohl float als auch double Datentypen.

Unter Verwendung der gleichen Methode wie im vorherigen Beispiel führt die Multiplikation des Werts von unsigned oder positive unendlich mit einem negativen Wert zum negativen unendlichen Wert.

#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;
}

Die Ausgabe für den obigen Code lautet wie folgt.

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

Wie zu sehen ist, erzeugen beide Methoden die gleiche Ausgabe, und beide können sicher verwendet werden, um negative Unendlichkeit in C++ zu implementieren.