Instant to mpq_class



  • Hallo zusammen,

    bin relativ neu und versuche einen Code zu verstehe.
    Wer kann mir das hier erklären, das gelingt mir nicht wirklich´

    Danke!

    mpq_class ItoMPQ( const Instant i )
    {
    mpq_class res = mpq_class(0);
    int days = (int)i.ToDouble();
    const int rest = i.GetAllMilliSeconds();
    const int milliseconds = 86400000;
    res = days + mpq_class(rest, milliseconds);
    res.canonicalize();
    return res;
    }



  • Ich bin verwirrt.

    Geht es um ein inhaltliches oder ein syntaktisches Verständnisproblem?



  • Keine Ahnung was mpq_class ist => keine Erklärung möglich

    Die Funktion wurde jedenfalls von einem Dilettanten geschrieben.



  • ich verstehe tatsächlich nicht, was insbesondere hier passiert

    const int milliseconds = 86400000;
    res = days + mpq_class(rest, milliseconds);
    res.canonicalize();

    Ich kenne den Ersteller nicht, wie würdest du es machen?



  • Ohne, dass du uns den Code von mpq_class zeigst koennen wir Dir nicht helfen.

    Am Besten auch von Instant i.
    Ansonsten wird da ein const int mit einem Wert angelegt.
    86400000 = 24 Stunden.

    Danach erfolgt anscheinend irgendeine Art von Addierung mit Hilfe eines überladenen Operators in mpq_class.

    Danach wird Member-Funktion canonicalize aufgerufen, die anscheinend irgendein Format herstellt jedenfalls wuerde das der Name suggerieren.

    Danach wird ein mpq_class per Kopie zurueckgegeben.



  • mpq_class ist ein Datentyp aus der GNU der sehr genau ist
    Instant ??? keine Ahnung, mal schauen ob ich da was finden kann



  • Instant beeinhaltet eine Zeit



  • ich konnte genau finden:

    typedef DateTime Instant;

    in einem h-file



  • SusanneS schrieb:

    Ich kenne den Ersteller nicht, wie würdest du es machen?

    Mal kurz drüber gebügelt:

    const int dayInMilliseconds = 86400000;
    
    mpq_class ItoMPQ( const Instant& i )
    {
      int days = i.ToDouble();
      mpq_class res = days + mpq_class( i.GetAllMilliSeconds(), dayInMilliseconds );
      res.canonicalize();
      return res;
    }
    


  • HI,

    das verstehe ich besser.
    Was passiert hier: res.canonicalize();

    UND wie würde daraus die Umkehrung aussehen?

    Herzlichen Dank!


  • Mod

    @manni: Erster Treffer bei Google: mpq_class ist die Dokumentation von GNU, auf der im Übrigen auch canocicalize definiert ist:

    Was passiert hier:

    res.canonicalize();
    

    Der Bruch wird gekürzt1. Die Umkehrung davon wäre demnach das Erweitern, i.e., die Multiplikation des Nenners und Zählers mit einer Ganzzahl ungleich 0 ( mpq_class repräsentiert, wie du wissen solltest, Brüche mit ganzzahligen Zählern/Nennern).

    Außerdem wäre die Definition von DateTime nicht schlecht.

    1 Außerdem wird dafür gesorgt dass der Nenner positiv ist. Falls dir übrigens der Begriff "kürzen" in diesem Kontext nichts sagt, hast du ein Problem.



  • Vielen Dank!

    Kürzen kenne ich 🙂


Anmelden zum Antworten