has_infinity()/ has_quiet_NaN()
-
Hey Leute,
ich möchte mit den Funktionen "isnotanumber" und "isinfinity" überprüfen, ob die übergebenen Variablen "x" beziehungsweise "y" unendlich beziehungsweise nicht definiert sind.
Header:
"#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include "math.h"
#include <cmath>
#include <limits>int isinfinity(int x){
int inf = numeric_limits<int>::has_infinity(x);
return inf;
}int isnotanumber(int y){
int nan = numeric_limits<int>::has_quiet_NaN(y);
return nan;
}"CPP-Datei:
"#include "stdafx.h"
#include "math.h"#include <limits>
#include <iostream>
#include <cstdio>using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
printf("isnan(0.0) : %d\n", isnotanumber(12));
return 0;
}"Der Compiler wirft folgende Fehler:
1>c:\users\hp\documents\visual studio 2010\projects\isnan_test\isnan_test\stdafx.h(18): error C2065: 'numeric_limits': nichtdeklarierter Bezeichner
1>c:\users\hp\documents\visual studio 2010\projects\isnan_test\isnan_test\stdafx.h(18): error C2062: 'int'-Typ unerwartet
1>c:\users\hp\documents\visual studio 2010\projects\isnan_test\isnan_test\stdafx.h(18): error C2039: 'has_infinity': Ist kein Element von 'global namespace'' 1>c:\\users\\hp\\documents\\visual studio 2010\\projects\\isnan\_test\\isnan\_test\\stdafx.h(23): error C2065: 'numeric_limits': nichtdeklarierter Bezeichner 1>c:\\users\\hp\\documents\\visual studio 2010\\projects\\isnan\_test\\isnan\_test\\stdafx.h(23): error C2062: 'int'-Typ unerwartet 1>c:\\users\\hp\\documents\\visual studio 2010\\projects\\isnan\_test\\isnan\_test\\stdafx.h(23): error C2039: 'has\_quiet\_NaN': Ist kein Element von '
global namespace''
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Was mache ich verkehrt? Vielen Dank für eure Hilfe!
-
Du hast vergessen,
numeric_limits
mitstd::
zu qualifizieren.
-
using namespace std vergessen in den funktionen, bzw std::numeric_limits<int> schreiben.
-
Vielen Dank für eure schnelle Hilfe. Nachdem ich den Quellcode berichtigt habe, liefert der Compiler mir die Fehlermeldung:
"1>------ Erstellen gestartet: Projekt: Isnan_Test, Konfiguration: Debug Win32 ------
1> stdafx.cpp
1>c:\users\hp\documents\visual studio 2010\projects\isnan_test\isnan_test\stdafx.h(18): error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
1>c:\users\hp\documents\visual studio 2010\projects\isnan_test\isnan_test\stdafx.h(23): error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen =========="Was ist verkehrt? Vielen Dank!
-
Das liegt daran, dass du
numeric_limits
völlig falsch verwendest.has_infinity
ist einfach ein statischer Member vom Typbool
, keine Funktion. Wenn du das haben möchtest, dann nimmstd::isinf
undstd::isnan
.
-
Und bei
int
gibt's sowieso kein NaN/INF.
=>return false;
tut's auch.
-
Hey Leute,
ich habe es mit Templates wie folgt versucht:
Header:
"#pragma once#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include "math.h"
#include <cmath>
#include <limits>template <class T> bool isnan(T t);
template<typename T>
inline bool isinf(T value)
{
return std::numeric_limits<T>::has_infinity() &&
value == std::numeric_limits<T>::infinity();
}template<typename T>
inline bool isnan(T value)
{
return value != value;
}"CPP:
"#include "stdafx.h"
#include <cmath>#include <limits>
#include <iostream>
#include <cstdio>using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
float nan = std::numeric_limits<float>::quiet_NaN();
nan=0;
float inf = std::numeric_limits<float>::infinity();
std::cout << nan << '\n';
std::cout << inf << '\n';
printf("isnan(0.0) : %d\n", isnan(nan));
printf("isnan(0.0) : %d\n", isinf(inf));
return 0;
}"Nun erhalte ich folgende Fehlermeldung für "isinf":
"1>------ Erstellen gestartet: Projekt: Isnan_Test, Konfiguration: Debug Win32 ------
1> stdafx.cpp
1> Isnan_Test.cpp
1>c:\users\hp\documents\visual studio 2010\projects\isnan_test\isnan_test\stdafx.h(39): error C2064: Ausdruck ergibt keine Funktion, die 0 Argumente übernimmt
1> c:\users\hp\documents\visual studio 2010\projects\isnan_test\isnan_test\isnan_test.cpp(22): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "bool isinf<float>(T)".
1> with
1> [
1> T=float
1> ]
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen =========="Was kann ich ändern? Vielen Dank für eure Hilfe!
-
C++Typ schrieb:
Was kann ich ändern?
Du könntest mal in Deine Unterlagen zu C++ gucken, anstatt hier jede Iteration Deines Programms einzustellen.
Dann kannst Du das plattformspezifische Gedöns weglassen (tchar.h, tmain
), so dass jeder Deinen Quellcode kopieren, einfügen und kompilieren kann.
Und drittens kannst Du Codetags verwenden (unter dem "Nachrichtentext"-Fenster).
-
Vielen Dank für höfliche Antworten