Wertebereich//Datentyp



  • Hallo,
    Ich bin neu in diesem Bereich und hab da mal eine direkte Frage.
    Kann mir jemand erklären,wie ich auf das Ergebnis komme.

    Frage :

    Geben Sie für die folgende Wertebereich einen geeigneten Datentyp an.
    Verwende Sie dabei den KLEINST möglichen Datentyp und achten Sie auch auf das Vorzeichen.

    Wertebereich Datentyp
    7.12 bis 100.121
    5bis 33000
    -5bis 33000
    0,145612141 bis 1
    XbisZ
    Ich hab mir schon so viel angeschaut und komme einfach nicht auf den richtigen Nenner.

    Bitte um Hilfe

    Vielen Dank schon mal


  • Mod

    Was hast du denn so angeschaut und was würdest du sagen, nach dem, was du so geschaut hast? Irgendeine Antwort wirst du doch wohl haben, selbst, wenn sie nicht richtig ist oder du mit der Begründung unsicher bist.

    PS: Leider so eine Aufgabe, bei der man merkt, dass der Fragesteller selber keine Ahnung hat. Tut mir leid um dich, wegen eines solch inkompetenten Lehrers. Die subtile Schwierigkeit bei Werten wie 7.12 ist sicher nicht beabsichtigt, aber faktisch ist sie da. Ein kompetenter Fragesteller hätte das erkannt. Auch ist die Frage denkbar dumm gestellt, weil nur aus Grenzen sich technisch gesehen nicht die geforderten Zwischenwerte ableiten lassen, was man ebenfalls viel kompetenter und verständlicher hätte fragen können. Hier muss man für die Antwort quasi schon im Voraus wissen, was der Fragesteller wohl wissen will, weil man klüger ist als der Fragesteller und sich in seine inkompetente Denke hineinversetzen kann 👎 .


  • Mod

    Wegen der dummen Fragestellung ist eigentlich eine Klugscheißerantwort angebracht (aber gib die bloß nicht deinem Lehrer!). C++20 gibt uns die Möglichkeit, dieses Monstrum zu konstruieren, das jedes dieser so schlecht definierten Intervalle auf 1 bool abbilden kann:

        #include <iostream>
        #include <stdexcept>
         
        template<auto low, decltype(low) high>
        class TrivialRange
        {
        	bool value;
        public:
        	TrivialRange(auto value)
        	{
                *this = value;
        	}
            operator decltype(low) () {if (value) return high;  return low;}
            TrivialRange operator=(decltype(low) value){    		
                if (value == low) this->value = false;
        		else if (value == high) this-> value = true;
        		else throw std::domain_error("Value not in TrivialRange");
                return *this;
            }
        };
         
        int main() {
        	TrivialRange<-5, 33000> a(-5);
            std::cout << a;
            a = 33000;
            std::cout << a;
            a = 0;  // Schmeißt Fehler, da nicht in definiertem Intervall
            std::cout << a;
        	return 0;
        }
    

    https://godbolt.org/z/TGcK7G7Er

    Der Compilersupport ist leider noch ein bisschen dünn dafür. C-lang meldet beispielsweise, dass es noch keine floating-Point Templateparameter unterstützt, auch wenn es technisch gesehen eigentlich keine Einschränkungen gibt, was da erlaubt ist.


  • Mod

    PS: Eine kompetente Fragestellung, die trotzdem (oder gerade deswegen!) die Antwort produziert, die dein Lehrer erwartet, wäre beispielsweise:
    Geben sie jeweils den kleinsten Basisdatentypen an, der geeignet ist, jeweils beide der aufgezählten Werte zu speichern:

    • 7.25 und 100.125
    • 5 und 33000
    • -5 und 33000
    • 0.14697265625 und 1
    • 'X' und 'Z'

    Vielleicht fällt es dir mit dieser Fragestellung leichter, das zu beantworten.

    Man beachte, dass ich andere Zahlen gewählt habe (selbst bei Nummer 4). Es sei dem geneigten Leser überlassen, die besondere Eigenschaft meiner Wahl zu finden.



  • ...und ich hatte bei 7.12 zunächst an den siebten Dezember gedacht (mit fehlendem Punkt am Ende), aber ich konnte 100.121 nicht so recht einordnen. Hier scheint wohl ein Komma gemeint zu sein, ist mir dann ein paar Sekunden später aufgefallen... (ja, die Programmiersprache erwartet einen Punkt als Dezimaltrenner, aber wenn der Aufgabentext Deutsch ist, gehe ich erstmal von Komma aus)


  • Mod

    @wob sagte in Wertebereich//Datentyp:

    ...und ich hatte bei 7.12 zunächst an den siebten Dezember gedacht (mit fehlendem Punkt am Ende), aber ich konnte 100.121 nicht so recht einordnen. Hier scheint wohl ein Komma gemeint zu sein, ist mir dann ein paar Sekunden später aufgefallen... (ja, die Programmiersprache erwartet einen Punkt als Dezimaltrenner, aber wenn der Aufgabentext Deutsch ist, gehe ich erstmal von Komma aus)

    Zumal es in Punkt 4 wieder andersrum ist. Was schon an Absicht denken lässt, und man darf einen alten Bekannten als Schreiber dahinter vermuten, aber geben wir ihm mal eine ehrliche Chance. Außerdem ist die Aufgabe (zumindest die klugscheißereische Auslegung derselben) an sich interessant genug - wie auch so oft bei unserem alten Bekannten.



  • Hi @RonnyF
    hilft das weiter?
    https://www.cpp-tutor.de/part1/daten.html
    https://learn.microsoft.com/de-de/cpp/cpp/data-type-ranges?view=msvc-170

    Ich nehme an, dass Du hier nach fragst, weil sich die Aufgabe auf C++ bezieht.

    Ansonsten recherchiere nach "C++ Datentypen Wertebereich", Du wirst fündig 😉



  • auto f = 7.12f;
    cout << setprecision(8) << nextafterf(f, -1) << " -> " << f << " -> " << nextafterf(f, 10) << "\n";
    

    7.1199994 -> 7.1199999 -> 7.1200004

    auto d = 7.12;
    cout << setprecision(18) << nextafter(d, -1) << " -> " << d << " -> " << nextafter(d, 10) << "\n";
    

    7.11999999999999922 -> 7.12000000000000011 -> 7.12000000000000099

    Welchen Wertebereich wählt man denn so für zwölf nach sieben? Muss man argumentieren, dass double der beste der Standard-Datentypen ist, weil er näher dran ist als float? Oder ist float die richtige Antwort? Oder soll man boost::rational vorschlagen?



  • Die Fragestellung spezifiziert ja nicht mal die Programmiersprache (auch wenn der TE das im C++ Bereich fragt).
    Ich habe bei 7.12 bis 100.121 an irgendeine Fixed Point Representation gedacht.

    Wenn man sich mit sowas beschäftigen muss, kann man doch fragen, wie viele Bits für die verschiedenen Repräsentationen theoretisch benötigt würden, sich dann angucken, welche Typen z.B. C++ dafür zur Verfügung stellt um dann die verschiedenen Probleme die daraus entstehen zu erarbeiten.

    Aber vlt wird das ja auch gemacht und die Aufgabe ist nur schlecht abgeschrieben.


  • Mod

    @Schlangenmensch sagte in Wertebereich//Datentyp:

    Wenn man sich mit sowas beschäftigen muss, kann man doch fragen, wie viele Bits für die verschiedenen Repräsentationen theoretisch benötigt würden, sich dann angucken, welche Typen z.B. C++ dafür zur Verfügung stellt um dann die verschiedenen Probleme die daraus entstehen zu erarbeiten.

    Wie gezeigt, reicht jeweils 1 Bit, solange man nur 2 Werte spezifiziert. Das ist auch keine Spitzfindigkeit, sondern einfach nur eine extreme Wahl der Basis. Wenn beispielsweise jemand einwendet, dass man für 'Y' und 'Z' mindestens 8 Bit bräuchte, für ASCII, dann ist die direkte Antwort darauf, dass ASCII ja eigentlich nur 7 Bit hätte, die etwas weniger direkte Antwort, dass es für das Alphabet von Großbuchstaben nur log_2(26) ~ 5 Bit bräuchte, die noch weniger direkte Antwort, dass man im Alphabet modulo 'Y' mit log_2(3) ~ 2 Bit auskäme, und halt meine allgemeine Antwort, dass man auch ein neues "Alphabet" nur aus 'Y' und 'Z' definieren kann, um mit einem Bit auszukommen. Äquivalent mit all den Zahlenbeispielen, wo ja genausowenig fest steht, das ein Bit unbedingt für eine 1 stehen muss. Die naheliegende Vereinfachung wäre die Zahl der 5en in den beiden Ganzzahlbeispielen, bis man am Ende wieder bei meinem 1 Bit für ein Zwei-Werte-System ankommt.



  • @SeppJ sagte in Wertebereich//Datentyp:

    … man darf einen alten Bekannten als Schreiber dahinter vermuten, aber geben wir ihm mal eine ehrliche Chance. …

    Das Muster war bisher fast immer das gleiche, nach der ersten Frage und Antworten darauf kam dann keinerlei zur Frage passende Erwiderung, sondern nur wieder irgend etwas vom Thema abweichendes.



  • @SeppJ In der Frage stand ja was von Wertebereich. Das hätte ich erstmal so interpretiert, dass nach einer Repräsentation gefragt ist, die alle Werte innerhalb des Wertebereichs darstellen kann und nicht nur angibt, ob ein Wert in dem Bereich liegt, oder nicht.


  • Mod

    @Schlangenmensch sagte in Wertebereich//Datentyp:

    @SeppJ In der Frage stand ja was von Wertebereich. Das hätte ich erstmal so interpretiert, dass nach einer Repräsentation gefragt ist, die alle Werte innerhalb des Wertebereichs darstellen kann und nicht nur angibt, ob ein Wert in dem Bereich liegt, oder nicht.

    Und was sind alle Werte in dem Bereich? Zähl mal alle Zahlen zwischen 0 und 10 auf!

    Mein Code prüft ausdrücklich nicht, ob ein Wert in dem Intervall liegt! Es ist bloß ein effizienter Datentyp für alle der angegebenen Werte.



  • @RonnyF

    Als weiteren Anhaltspunkt würde ich den Computer fragen:

    #include <iostream>
    
    
    template<typename T>
    void PrintRangeType(T t1, T t2)
    {
        std::cout << "Range(" << t1 << ", " << t2 << ")\n";
        std::cout << "  Type = " << typeid(t1).name() << "\n";
        std::cout << "  size = " << sizeof(t1) << " Bytes\n\n";
    }
    
    
    int main()
    {
        PrintRangeType(7.12, 100.121);
        PrintRangeType(5, 33000);
        PrintRangeType(-5, 33000);
        PrintRangeType(0.145612141, 1.0);
        PrintRangeType('X', 'Z');
        return 0;
    }
    

    Die Wahl dürfte vermutlich nicht das sein, was dein Lehrer möchte, es ist aber nah dran.



  • @SeppJ sagte in Wertebereich//Datentyp:

    @Schlangenmensch sagte in Wertebereich//Datentyp:

    @SeppJ In der Frage stand ja was von Wertebereich. Das hätte ich erstmal so interpretiert, dass nach einer Repräsentation gefragt ist, die alle Werte innerhalb des Wertebereichs darstellen kann und nicht nur angibt, ob ein Wert in dem Bereich liegt, oder nicht.

    Und was sind alle Werte in dem Bereich? Zähl mal alle Zahlen zwischen 0 und 10 auf!

    Mein Code prüft ausdrücklich nicht, ob ein Wert in dem Intervall liegt! Es ist bloß ein effizienter Datentyp für alle der angegebenen Werte.

    Aber das Wort "bis" legt schon nahe, daß auch alle Werte dazwischen gemeint sind.



  • @Tyrdal sagte in Wertebereich//Datentyp:

    Aber das Wort "bis" legt schon nahe, daß auch alle Werte dazwischen gemeint sind.

    Aber was sind den "alle" Werte? Alle rationalen und irrationalen Zahlen? Wie speichert man die? Ist jetzt double immer besser als float, weil damit mehr Zahlen in dem Intervall enthalten sind? Was ist mit float16 oder float128? Wie @SeppJ richtig angemerkt hat, ist die Aufgabestellung nicht präzise genug. (und ja, ich habe tatsächlich schon einmal float16 verwendet - für eine sehr große Matrix mit betraglich kleinen unpräzisen Zahlen!)



  • @SeppJ Ich habe geahnt, dass so eine Antwort kommt.
    Natürlich fehlen der Fragestellung noch entsprechenden Feinheiten um eine exakte Fragestellung zu haben (oder, vielleicht etwas schöner, Kontext über die Anwendung), aber es ist nicht unmöglich den Sinn hinter der Frage zu erahnen. Ich denke nicht, dass es dafür unbedingt nötig ist, die Menge der Zahlen mathematisch sauber zu definieren und zu schreiben:

    Gegen sei die Menge M

    M:={xx=n1000nN}M:= \{ x | x = \frac{n}{1000} \wedge n \in \mathbf{N} \}

    Was ist der kleinste Datentyp ist nötig um alle x aus dem Intervall I

    I:={xM7,120x100,121}I := \{x \in M| 7,120 \leq x \leq 100,121\}

    darzustellen.

    Wie oben bereits geschrieben, ja, die Fragestellung ist nicht präzise, aber wann hat man schon mal exakte Anforderungen 😉

    (Ja, zum lernen der Konzepte finde ich exakte Fragen auch besser).


  • Mod

    @Schlangenmensch sagte in Wertebereich//Datentyp:

    @SeppJ Ich habe geahnt, dass so eine Antwort kommt.
    Natürlich fehlen der Fragestellung noch entsprechenden Feinheiten um eine exakte Fragestellung zu haben (oder, vielleicht etwas schöner, Kontext über die Anwendung), aber es ist nicht unmöglich den Sinn hinter der Frage zu erahnen.

    Ach! Vielleicht möchtest du meine Antworten zu Anfang nochmal lesen?



  • @wob sagte in Wertebereich//Datentyp:

    @Tyrdal sagte in Wertebereich//Datentyp:

    Aber das Wort "bis" legt schon nahe, daß auch alle Werte dazwischen gemeint sind.

    Aber was sind den "alle" Werte? Alle rationalen und irrationalen Zahlen? Wie speichert man die? Ist jetzt double immer besser als float, weil damit mehr Zahlen in dem Intervall enthalten sind? Was ist mit float16 oder float128? Wie @SeppJ richtig angemerkt hat, ist die Aufgabestellung nicht präzise genug. (und ja, ich habe tatsächlich schon einmal float16 verwendet - für eine sehr große Matrix mit betraglich kleinen unpräzisen Zahlen!)

    Nun, das würde ich in der Antwort selbst festlegen. Also was weiß ich: Architektur x86_64, die Zahlen mit Komma sind Gleitkommazahlen und die Punkte werden ignoriert.


  • Mod

    Dann gibt aber deine physische Hardware die logischen Anforderungen an die Software vor. Schlechte Praxis!


Anmelden zum Antworten