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.


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



  • Sehe ich auch so, war auch als Scherz gemeint mit der CPU. Obwohl ich durchaus auch schon einige Fälle gesehen habe, in denen man dem Kunden auch noch eine Hardware mitverkauft hat, die eigentlich bei besserer Softwarequalität unnötig gewesen wäre - da reibt man sich doch die Hände 😁 ... die Gematik scheint mir so ein Laden zu sein, z.B. wegen der Sache mit dem Konnektorentausch vor einiger Zeit (wenn auch nicht direkt ein Softwareproblem).

    @SeppJ sagte in Wertebereich//Datentyp:

    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.

    Ja, das kann ich verstehen. Interessante Fragen zerpflücke ich auch gerne genüsslich. Selbst wenn es nur von nem Troll kommt oder ein "Mach meine Hausaufgaben"-Thread ist. Hauptsache man hat seinen Spass und macht sich selbst auch nochmal Gedanken zu dem Thema. Dabei lernt man meist selbst auch noch eine Menge (oder frischt das Wissen nochmal auf) 😉



  • Nachdem ich mich nunmehr einige Stunden mit dem Thema beschäftigt habe, zurück in verlorenes Wissen aus dem Studium abtauchte, erfuhr, dass unterschiedliche Zahlensysteme und Primfaktoren etwas miteinander zu tun haben, und vieles mehr, komme ich nun mit meiner eigenen Klugscheißer-Antwort hervor (ungeachtet der Auflösung d. Wertebereichs).

    0,145612141 bis 1

    "Ich möchte bitte unsigned char[3] einlocken"
    "Sind Sie sicher?"
    "Ja."

    Falls wir in den Spielregeln auch nicht-konventionelle Hardware erlauben, dann wäre meine Antwort in dem Fall lieber uint19_t.
    Upps, Denkfehler, wenn schon uint21_t

    Edit: Ach, mist, schon wieder viel zu kompliziert gedacht. Es ging ja quasi nur drum, ob short oder float, usw.
    Insbesondere dachte ich bei "X und Z", man solle eine generische Formel für fixed point aufstellen 🤷♂



  • @SeppJ sagte in Wertebereich//Datentyp:

    @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.

    Wieso sollten 712, 100121, und 145612141 nicht binär darstellbar sein?


  • Mod

    @Tyrdal sagte in Wertebereich//Datentyp:

    @SeppJ sagte in Wertebereich//Datentyp:

    @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.

    Wieso sollten 712, 100121, und 145612141 nicht binär darstellbar sein?

    Weil 712 nicht 7.12 ist. 712 * 10^-2 ist 7.12. Aber fällt dir was auf? Da ist eine 10 in der Rechnung. Nenn mir ganzzahlige X und Y, so dass X * 2^Y = 7.12, und du hättest Recht! Denn irgendwo muss ja festgehalten werden (egal ob statisch oder dynamisch), dass die 712 (oder das X ) noch mit irgendetwas multipliziert werden soll, um auf den gewünschten Wert zu kommen. Wenn du es mit einer Zehnerpotenz multiplizierst, ist das kein Wert im Binärsystem mehr, und somit wären double und float raus, denn die können nur Zweierpotenzen.

    Du hast natürlich insofern recht, als das ein Fixed Point Decimal (oder auch ein Floating Point Decimal) eine mögliche (und gut passende!) Antwort auf die Aufgabenstellung ist. Aber Decimals sind halt keine Zahlen im Binärsystem. Es gibt auch keine üblichen Maschinendatentypen dafür, sondern es sind auf den meisten Maschinen komplexe Datentypen, die das Verhalten in der Software nachbilden.



  • @SeppJ sagte in Wertebereich//Datentyp:

    Es gibt auch keine üblichen Maschinendatentypen dafür, sondern es sind auf den meisten Maschinen komplexe Datentypen, die das Verhalten in der Software nachbilden.

    Das stimmt so nicht. Es gibt diese Datentypen nur auf bestimmte CPU Architekturen (IBMs Power und die z Series sowie Fujitsu SPARC CPUs können Dezimalgleitkomma in Hardware), und früher war BCD eigentlich auf jeder Plattform vorhanden. Bei x86 gibt es noch immer in der x87 FPU BCD Formate. Allerdings sollte man die x87 Instruktionen nicht mehr nutzen, weil Intel plant x87 in absehbarer Zukunft los zu werden.



  • @SeppJ sagte in Wertebereich//Datentyp:

    @Tyrdal sagte in Wertebereich//Datentyp:

    @SeppJ sagte in Wertebereich//Datentyp:

    @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.

    Wieso sollten 712, 100121, und 145612141 nicht binär darstellbar sein?

    Weil 712 nicht 7.12 ist.

    Doch, weil ich festgelegt habe, daß ich den Punkt ignoriere da nicht eindeutig.


Anmelden zum Antworten