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!


  • Mod

    Du hast vergessen, numeric_limits mit std:: 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!


  • Mod

    Das liegt daran, dass du numeric_limits völlig falsch verwendest. has_infinity ist einfach ein statischer Member vom Typ bool , keine Funktion. Wenn du das haben möchtest, dann nimm std::isinf und std::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 😉


Log in to reply