numeric_limtis



  • std::numeric_limits<T>::is_integer - true if type is integer.
    std::numeric_limits<T>::is_exact - true if type uses exact representations.
    wo ist da der unterschied?

    und angenommen ich scheibe selbst eine numerische klasse, darf ich dann numeric_limits im std-namensbereich spezialisieren und da die attribute meiner klasse eintragen?



  • numeric_limits im std-namensbereich spezialisieren

    Nein, unter Vorbehalt.

    std::numeric_limits<T>::is_integer - true if type is integer.
    std::numeric_limits<T>::is_exact - true if type uses exact representations.
    wo ist da der unterschied?

    A sagt semantisch was anderes als B. Ich kann exakt sein, ohne dass ich Integer bin. Was sagt erstes und letzteres zu ratio?


  • Mod

    numeric_limits im std-namensbereich spezialisieren

    Ja, das darfst du für eigene Typen.

    §17.6.4.2.1/1 schrieb:

    A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.

    Allerdings gibt es für numeric_limits eine Ausnahme:

    §18.3.2.1/4 schrieb:

    Non-arithmetic standard types, such as complex<T>, shall not have specializations.



  • knivil schrieb:

    Was sagt erstes und letzteres zu ratio?

    mein compiler hat keinen vollen c++11 support.

    Arcoth schrieb:

    Allerdings gibt es für numeric_limits eine Ausnahme:

    §18.3.2.1/4 schrieb:

    Non-arithmetic standard types, such as complex<T>, shall not have specializations.

    ich bin mir nicht sicher ob ich das richtig verstehe. also numeric_limits darf einfach für std-member nicht überladen werden, ja? und complex<T> ist doch ein arithmetischer typ, zumindest simuliert er arithmetisches verhalten...


  • Mod

    Nein, complex<T> ist kein arithmetischer Typ, sondern eine Klasse. Zumindest nach Standard. Arithmetische Typen sind float , int , double , char , usw.

    ich bin mir nicht sicher ob ich das richtig verstehe. also numeric_limits darf einfach für std-member nicht überladen werden, ja?

    So ist es.

    mein compiler hat keinen vollen c++11 support.

    Es ging ja nur ums Beispiel.

    Übrigens, genau aus meiner oben genannten Ausnahme ist Knivils Tipp Unfug.

    #include <ratio>
    #include <limits>
    static_assert( std::numeric_limits<std::milli>::is_specialized, "" ); // schlägt natürlich fehl
    


  • Übrigens, genau aus meiner oben genannten Ausnahme ist Knivils Tipp Unfug.

    Welcher Tip?

    http://en.cppreference.com/w/cpp/types/numeric_limits/is_exact :

    While all fundamental types T for which std::numeric_limits<T>::is_exact==true are integer types, a library may define exact types that aren't integers, e.g. a rational arithmetics type representing fractions.


  • Mod

    Ach, ich dachte, du meinst ganz konkret std::ratio . 🙂 Natürlich, Bruchklassen sind ein gutes Beispiel.
    (Das Problem wäre, dass die unspezialisierte Version immer noch alle Member hat, und man dann trotzdem auf sie zugreifen kann - auch wenn sie falsche Werte haben)


Anmelden zum Antworten