Wertebereich//Datentyp


  • 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!



  • @SeppJ sagte in Wertebereich//Datentyp:

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

    Versteh ich nicht. Ich entwickle meine Software immer auf und für Hardware 🤷♂️ Aber nimm von mir aus unint32_t und Konsorten.


  • Mod

    @Tyrdal sagte in Wertebereich//Datentyp:

    Versteh ich nicht. Ich entwickle meine Software immer auf und für Hardware 🤷♂️ Aber nimm von mir aus unint32_t und Konsorten.

    Auftraggeber spezifiziert: Software muss ganzzahlige Werte bis 9999999999999 unterstützen. Tyrdal nimmt int, weil das der native Datentyp der Maschine für Ganzzahlen ist, was ja richtig sein muss.

    Auftraggeber spezifiziert: Rechnung muss exakt sein auf drei dezimale Stellen. Tyrdal nimmt float, weil das der native Datentyp der Maschine für reelle Zahlen ist, was ja richtig sein muss..

    Bei dir bestell' ich nix.



  • @SeppJ sagte in Wertebereich//Datentyp:

    Auftraggeber spezifiziert: Rechnung muss exakt sein auf drei dezimale Stellen. Tyrdal nimmt float, weil das der native Datentyp der Maschine für reelle Zahlen ist, was ja richtig sein muss..

    Software läuft halt nur auf Power10 mit FPU-Support für Decimal Floats. Den musste halt mitbestellen, wenn du so technisch anspruchsvolle Anforderungen hast 😝



  • @SeppJ sagte in Wertebereich//Datentyp:

    @Tyrdal sagte in Wertebereich//Datentyp:

    Versteh ich nicht. Ich entwickle meine Software immer auf und für Hardware 🤷♂️ Aber nimm von mir aus unint32_t und Konsorten.

    Auftraggeber spezifiziert: Software muss ganzzahlige Werte bis 9999999999999 unterstützen. Tyrdal nimmt int, weil das der native Datentyp der Maschine für Ganzzahlen ist, was ja richtig sein muss.

    Auftraggeber spezifiziert: Rechnung muss exakt sein auf drei dezimale Stellen. Tyrdal nimmt float, weil das der native Datentyp der Maschine für reelle Zahlen ist, was ja richtig sein muss..

    Bei dir bestell' ich nix.

    Wo kamen denn derartige Forderungen im Original Post vor? Ich habe meine Rahmenbedingungen vorgegeben, weil keine da waren. Und damit gehts.


  • Mod

    @Tyrdal sagte in Wertebereich//Datentyp:

    Wo kamen denn derartige Forderungen im Original Post vor? Ich habe meine Rahmenbedingungen vorgegeben, weil keine da waren. Und damit gehts.

    Ja, eben. Du hast dir selbst irgendetwas ausgedacht, das gar nicht in der Anforderung steht. Schlimmer noch: Es passt nicht einmal zur Anforderung, denn wie hier im Thread groß diskutiert, sind keiner der Werte 7.12, 100.121, und 0.145612141 überhaupt in einem Binärsystem darstellbar.

    @Finnegan sagte in Wertebereich//Datentyp:

    @SeppJ sagte in Wertebereich//Datentyp:

    Auftraggeber spezifiziert: Rechnung muss exakt sein auf drei dezimale Stellen. Tyrdal nimmt float, weil das der native Datentyp der Maschine für reelle Zahlen ist, was ja richtig sein muss..

    Software läuft halt nur auf Power10 mit FPU-Support für Decimal Floats. Den musste halt mitbestellen, wenn du so technisch anspruchsvolle Anforderungen hast 😝

    Oder halt einen komplexen Datentypen nutzen, der den Anforderungen nachkommt. Ist ja nicht so, dass ein Rechnen mit solchen Zahlen auf x86 unmöglich wäre, es wäre nur etwas langsamer als mit den nativen Typen. Wenn's dem Auftraggeber zu langsam ist, dann muss er halt eine optimierte Hardware/Softwarekombination bestellen und der Erfüller kann dann Power10 liefern.

    Aber allgemein ist logisch korrekte Erfüllung der Anforderungen doch offensichtlich immer das oberste Ziel. Es interessiert niemanden, wie schnell du ein falsches Ergebnis berechnen kannst. Oft ist die logische Anforderung auch, dass eine Rechnung in bestimmter Zeit fertig wird (z.B. Framerate bei Spielen) oder wenigstens so schnell wie möglich im Rahmen einer gewissen Genauigkeit (wissenschaftliches Rechnen). Da ist die erste Anlaufstelle natürlich die Fähigkeiten der Hardware auszureizen. Aber halt nur, wenn die Genauigkeit dabei im durch die Anforderung definierten Rahmen bleibt, sonst ist das auch nutzlos.

    In den allermeisten Fällen sind die Maschinentypen ja auch weit überdimensioniert für die notwendigen Genauigkeiten, aber hier ist halt die Aufgabe scheiße gestellt, weil alle drei gezeigten rationalen Zahlen eben zu keinem üblichen Maschinentypen passen (obwohl der dumme Lehrer offensichtlich float und double als Antwort sucht). Wenn da in der Aufgabe sonst nichts steht, ist die halt inkompetent gestellt, und somit eine Einladung, unseren Spaß mit einer kleinkarierten Antwort zu haben.


Anmelden zum Antworten