Prüfen ob eine zahl definiert ist
-
isinf ist neu in C++11.
In C++03 hilft
d == std::numeric_limits<double>::infinity()
. Dazu<limits>
einbinden.
-
Alles klar... um mal die Einzeiller zu vermeiden:
Nutze Visual Studio 2010 mit QT Plugin (4.3 irgendwas).
Der Namensraum std::isinf existiert nicht.
Wenn ich <math.h> oder / und <cmath> einbinge verändert dies nix.
Wo liegt der Fehler?
-
Veralteter Compiler, nimm VS 2012. (Oder das von infinitiiii)
-
infinitiiii schrieb:
isinf ist neu in C++11.
dein compiler unterstützt das ganze dann halt noch nicht.
-
freddy_kay schrieb:
Alles klar... um mal die Einzeiller zu vermeiden:
Nutze Visual Studio 2010 mit QT Plugin (4.3 irgendwas).
Der Namensraum std::isinf existiert nicht.
Wenn ich <math.h> oder / und <cmath> einbinge verändert dies nix.
Wo liegt der Fehler?
Evtl. musst Du auf die c-macros zurückgreifen, dann ohne
std::
.
Spätestens wenn Du dann noch <math.h> statt <cmath> inkludierst müsste das doch funktionieren...
-
Diese Funktionen gibt es, zumindest offiziell, erst seit C++11. Oftmals sind sie trotzdem in der Standardbibliothek vorhanden, da die Funktionen mit C99 eingeführt wurden. Falls man also ein pedantisch C++98-konformes Programm schreiben möchte, muss man sich diese selbst definieren. Dies geht relativ leicht über die Definition der Sonderwerte:
bool isnan(double x) { return x != x; } // nutzt Nan != Nan bool isinf(double x) { return !isnan(x) && isnan(x - x); } // Nutzt inf-inf=NaN
Äquivalent für andere Eigenschaften von Fließkommazahlen, wie Endlichkeit (weder inf noch NaN) oder was immer dir sonst noch einfällt.
-
Alles klar danke euch Leute.
Leider krieg ich das mit den numeric limits nicht zum laufen da ich nicht dahinter komme wie man das auf eine konkrete Zahl anwendet, daher werd ich "quick & dirty" Sepps vorschlag nehmen.
Schönen Abend noch euch allen
-
freddy_kay schrieb:
Leider krieg ich das mit den numeric limits nicht zum laufen da ich nicht dahinter komme wie man das auf eine konkrete Zahl anwendet
??
#include <iostream> #include <limits> int main() { double d; cin >> d; // gib hier 0 ein d = 1./d; if ( d == std::numeric_limits<double>::infinity() ) cout << "lol" << endl; std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin.clear(); std::cin.get(); return 0; }
-
man kann auch die Funktionen aus der C Runtime nutzen, insbesondere dann, wenn das Programm auch mit älteren Compilern laufen soll
http://msdn.microsoft.com/en-us/library/tzthab44.aspx
http://linux.die.net/man/3/isnanvon mir noch der Hinweis: bei einen NaN kann schon der operator==(double,double) eine num. Exception werfen, je nachdem, welchen Compiler man nutzt und welche Compileroptionen
-
Skym0sh0 schrieb:
cin >> d; // gib hier 0 ein
Interessanter: Gib -0 ein.
dd++ schrieb:
bei einen NaN kann schon der operator==(double,double) eine num. Exception werfen, je nachdem, welchen Compiler man nutzt und welche Compileroptionen
Ich denke mal, man darf von IEEE 754 konformem Verhalten ausgehen, wenn man solche Fragen stellt.
-
ok, da kommt dann hier ein -1.#Inf raus...
-
Skym0sh0 schrieb:
freddy_kay schrieb:
Leider krieg ich das mit den numeric limits nicht zum laufen da ich nicht dahinter komme wie man das auf eine konkrete Zahl anwendet
??
#include <iostream> #include <limits> int main() { double d; cin >> d; // gib hier 0 ein d = 1./d; if ( d == std::numeric_limits<double>::infinity() ) cout << "lol" << endl; std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin.clear(); std::cin.get(); return 0; }
hmm... komisch, als ich genau das gestern versucht hab, gings nicht... Habs jez reinkopopiert und funktioniert.
Wie dem auch sei es funktioniert auch der Vorschlag von dd++
Dankeschön an alle