Ankündigung

Einklappen
Keine Ankündigung bisher.

Kalenderberechnungen ( Osterformel )

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Zitat von enertegus Beitrag anzeigen
    Wieso denn dann im Flash abspeichern?
    Weil viele Strings abgelegt und danach per Index gelesen werden sollen. Das geht sonst so nicht da der EibPC ja keine echten Arrays kennt.
    Ich würde ein c1400 Pseudoarray verwenden, aber Wolfgang mag das so nun einmal nicht.


    Aber was ich mich hier schon die ganze Zeit frage:

    Den Spieltrieb in allen Ehren, macht es wirklich Sinn Ostern und einige andere bewegliche Basistage wie z.B. 1.Advent im EibPC zu berechnen?

    Mal nachgedacht, um ein Datum zu speichern brauche ich 1 Byte für den Tag, 1 Byte für den Monat und wenn ich 2000 als Offset verwende kann ich mit 1 Byte beim Jahr bis 2255 gehen. Somit benötigt ein Datum 3 Byte. In einen String passen dann 466 Tage (= 1398 Byte).

    Die meisten Feiertage sind fix, viele bewegliche hängen von Ostern ab, einige bewegliche vom 1.Advent. Sommerzeit, Winterzeit und Muttertag haben ihre eigenen Regeln. Da kommen wir auf 5 bewegliche Tage im Jahr, die nicht durch einen fixen Offset von anderen abhängen.

    Da passen dann also 93 Jahre (= 465 Tage = 1395 Byte) in einen String. Wer noch 10 weitere Tage hat, kann immer noch 31 Jahre vorberechnen. Ich wage zu behaupten, das keiner hier so lange einen EibPC in Betrieb haben wird.

    Also sollte das mehr als genug sein. Warum also Zeit fürs Entwickeln und Debuggen und Rechenleistung dafür verbraten? Bis der Code fehlerfrei läuft hat man die Tabelle schon für Jahrhunderte vom PC berechnen lassen.

    Eine elegante Lösung ist halt nicht unbedingt immer auch die vernünftigste...
    Tessi

    Kommentar


      #17
      Hallo Tessi,

      hast generell Recht - wegen den paar Werten sollte man sich den Aufwand schon ueberlegen ...
      Hinsichtlich dem Array ist es genau so - ich wollte indexiert zugreifen.
      Habe aber inzwischen eingesehen, dass es wenig sinnvoll ist und einfache
      Strukturen auch ihren Vorteil haben.
      Daher habe ich jetzt meine Struktur wie folgt umgesetzt:
      + ich bestimmer ueber ein Makro ( Ostertag() ) den Ostertag
      + mit einer Abwandlung von "UnixTime" kann ich Tage addieren
      und daraus wieder ein Datum berechnen ( ist mir hilfreich fuer weitere
      Datumsoperationen ): damit habe ich eine handvoll Variablen mit den
      Feiertagen
      + ueber diese Feiertage bilde ich mir ueber eine Funktion IsFeiertag()
      ein Flag zur Steuerung: z.B. Jalousie etc.

      Ich werde nun die nächsten Tage testen ;-)

      Gruss

      Wolfgang
      FB_Addon_TelNo{ height:15px !important; white-space: nowrap !important; background-color: #0ff0ff;}
      ETS 6.2 EibPC V3.x

      Kommentar


        #18
        Was übrigens auch ginge:
        Für jeden Tag im Jahr gibt es ein Bit im String das anzeigt, ob es ein Feiertag ist, oder nicht.
        Pro Monat würde ich einfach 4 Byte = 32 Bit nehmen (auch wenn nur 28 bis 31 Bit davon gebraucht werden und so 18 bis 19 Bits pro Jahr ungenutzt bleiben), ein Jahr belegt so 48 Byte. Damit passen in einen c1400 String 29 Jahre und 8 Byte bleiben frei. In 2 dieser 8 Byte sollte das Jahr und in einem der Monat stehen, mit dem diese Tabelle beginnt. Wer also ab Januar 2013 berechnet, schreibt dort 2013 und 1 hinein.
        Der u32 Wert eines Monats hat dann den Index (Jahr-2013)*12+(Monat-1).
        Den Tag ermittle ich mit
        Es gibt keine Bit-shift-Befehle!!! Rotation ist auch nicht möglich!!!

        Wie generiere ich aus einer Zahl n eine 32 Bit Maske, bei der nur das n. Bit gesetzt ist? Muss ich etwa eine Schleife bauen, die 1 n mal mit 2 multipliziert? Oder ein Pseudo-Array mit 32 32 Bit Masken?
        Wieso gibt es ausgerechnet die einfachsten Bitmanipulationen nicht, die jeder Controller bereits als atomare Maschinenbefehle hat?

        Und kommt mir jetzt nicht mit pow(2,n), der funktioniert nur mit f32 und ob da nach convert() in ein u32 dann noch genau nur das n. Bit gesetzt ist, wäre angesichts der geringen Genauigkeit von f32 erst einmal zu beweisen. Abgesehen davon ist die Berechnung von 2^n als f32 erheblich aufwendiger als ein simples shift left n Bit bei einem u32.
        Tessi

        Kommentar


          #19
          Zitat von Tessi Beitrag anzeigen
          Es gibt keine Bit-shift-Befehle!!! Rotation ist auch nicht möglich!!!

          Wie generiere ich aus einer Zahl n eine 32 Bit Maske, bei der nur das n. Bit gesetzt ist? Muss ich etwa eine Schleife bauen, die 1 n mal mit 2 multipliziert? Oder ein Pseudo-Array mit 32 32 Bit Masken?
          Und kommt mir jetzt nicht mit pow(2,n), der funktioniert nur mit f32 und ob da nach convert()

          [highlight=epc]
          // Maske
          u=0xFF0u32 and 0x100u32
          // Shiften nach rechts
          s1=u/0x10u32
          // Shiften nach links
          s2=s1*0x10u32
          [/highlight]
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #20
            Ein grimmiges ??
            Das ist jetzt ein Missverständnis!

            Das ich mit "and" eine Maske anwenden kann ist klar (und ist sicherlich nur der Vollständigkeit halber erwähnt worden)

            Das eine Multiplikation oder Division mit speziellen Werten im Resultat wie eine Verschiebung wirkt ist auch nicht neu - hilft mir aber noch nicht, denn:

            Wenn ich so "schieben" wollte, hätte ich aber immer noch einen ungelösten Punkt:
            Ich habe nicht den passenden Multiplikator/Divisor sonder die Anzahl an Bits um die geschoben werden soll.

            Also wie komme ich im vorliegenden Beispiel von der Anzahl 4 auf den Multiplikator 0x10?
            Und wie käme ich bei einem 63 Bit Shift (um z.B. aus 1u64 8000000000000000u64 zu machen) vom Wert 63 auf den notwendigen Multiplikator 8000000000000000u64?

            Aber bevor man hier mathematische Ungetüme aufbaut, wäre ein simpler Shift-Befehl nicht nur einfacher in der Anwendung sondern auch unschlagbar schnell in der Ausführung.

            Das darf jetzt durchaus als Feature-Wunsch betrachtet werden
            Tessi

            Kommentar


              #21
              Zitat von Tessi Beitrag anzeigen
              Das ich mit "and" eine Maske anwenden kann ist klar
              Darum gings Dir doch, so dachte ich. Also es geht m.E. unproblematisch, da braucht es doch eine Feature?
              Du kannst Dir ja eine Makrofunktion definieren...
              Aber bevor man hier mathematische Ungetüme aufbaut, wäre ein simpler Shift-Befehl nicht nur einfacher in der Anwendung sondern auch unschlagbar schnell in der Ausführung.
              Stimmt nicht wirklich. Integeroperationen werden wie shift-Operationen in einem Maschinenzyklus berechnet.
              Also wäre
              x=2*0x10
              genau so schnell wie
              x=shift(2,4)
              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
              Enertex Produkte kaufen

              Kommentar


                #22
                Zitat von enertegus Beitrag anzeigen
                Darum gings Dir doch, so dachte ich.
                Nein, hier wird die Maske angewendet, aber so weit komme ich ja noch gar nicht, eben diese Maske kann ich nicht erzeugen

                Zitat von enertegus Beitrag anzeigen
                Also es geht m.E. unproblematisch, da braucht es doch eine Feature?
                Für die Anwendung der Maske natürlich nicht, aber für ihre Erzeugung schon!

                Zitat von enertegus Beitrag anzeigen
                Du kannst Dir ja eine Makrofunktion definieren...
                Mit welchen Mitteln? Es bleibt ja das Problem:
                Ich habe nicht den passenden Multiplikator/Divisor sondern die Anzahl an Bits um die geschoben werden soll.

                Also wie komme ich Deinem Beispiel von der Anzahl 4 auf den Multiplikator 0x10?
                Und wie käme ich bei einem 63 Bit Shift (um z.B. aus 1u64 8000000000000000u64 zu machen) vom Wert 63 auf den notwendigen Multiplikator 8000000000000000u64?

                Erst wenn das gelöst ist, dann kann ich multiplizieren oder Dividieren - und erst danach habe ich dann die Maske, die ich mit "and" dann einfach anwenden kann.

                Zitat von enertegus Beitrag anzeigen
                Stimmt nicht wirklich. Integeroperationen werden wie shift-Operationen in einem Maschinenzyklus berechnet.
                Also wäre
                x=2*0x10
                genau so schnell wie
                x=shift(2,4)
                OK, nur muss ich für
                x=2*0x10
                die 0x10 erst einmal irgendwie aus der 4 bestimmen (und weiß noch nicht wie) und das kostet auch mindestens einen Maschinenzyklus. Aber selbst das und ein Makro wäre ja zunächst in Ordnung, wenn ich wenigstens eine Funktion hätte für die gilt:
                f(00)=0x0000000000000001
                f(01)=0x0000000000000002
                f(02)=0x0000000000000004
                f(03)=0x0000000000000008
                f(04)=0x0000000000000010
                f(05)=0x0000000000000020
                f(06)=0x0000000000000040
                f(07)=0x0000000000000080
                f(08)=0x0000000000000100
                ...
                f(60)=0x1000000000000000
                f(61)=0x2000000000000000
                f(62)=0x4000000000000000
                f(63)=0x8000000000000000

                So etwas aber fehlt und bevor eine solche Spezialfunktion implementiert wird, dann doch lieber gleich eine flexiblere Shift-Funktion.

                Bislang könnte ich höchstens eine Schleife bauen, die 0x1 n mal mit 0x2 multipliziert, aber das benötigt nicht einige Maschinenzyklen sondern gleich bis zu 63 Verarbeitungszyklen zu je 20ms oder mehr (je nachdem was als Pause zwischen zwei Zyklen eingestellt ist). Und das ist keine wirkliche Alternative, das klingt wie ostfriesischer Lampenwechsel: Lampe festhalten, Haus drehen...
                Ansonsten bliebe noch ein Array mit obigen 64 64 Bit Masken (in denen je genau 1 Bit gesetzt ist) und der Index korrespondiert mit der Bitposition. Geht sicherlich deutlich schneller, benötigt aber 512 vorberechnete Bytes in einem String. Momentan das Beste was mir einfällt, aber auch nicht wirklich der Weisheit letzter Schluss.
                Mathematisch ginge es noch über die Potenzfunktion, aber ob pow(2,63) als f32 Wert berechnet nach der Konvertierung in einen u64 Wert tatsächlich auch genau 0x8000000000000000u64 ergeben wird, wage ich angesichts der recht schmalen Mantisse bei f32 und der näherungsweisen Berechnung (eben weil Fließkomma) der Potenz doch sehr zu bezweifeln - also eher keine Lösung...

                Also alles nur Krücken, und das nur, weil ein einfaches Shift nicht existiert...
                Tessi

                Kommentar


                  #23
                  ich hoff ich bin nicht der einzige der das alles nicht mehr checkt ..

                  und was das mit Ostern zu tun hat versteh ich auch nicht mehr

                  nix für ungut

                  Martin
                  Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                  Kommentar


                    #24
                    Da bist Du wohl nicht allein, ich habe das Gefühl, auch jene, von denen ich erwartet/gehofft habe, das sie mir helfen können, haben Verständnissprobleme mit meinen Beiträgen. Sind sie vielleicht einfach zu lang???

                    Aber wenn es Dich noch interessiert, lies mal Beitrag #18 (und ggf. #16 als Einstieg), das könnte helfen, Licht ins Dunkle zu bringen. Ansonsten kannst Du hier mit dem Lesen aufhören...

                    Für diejenigen, die doch noch bei mir bleiben wollen:

                    In #18 möchte ich für einen Monat in einen u32 Wert für jeden Tag ein Bit haben, das signalisiert, ob das ein Feiertag ist, oder eben nicht, weil ich so in einem c1400 für rund 29 Jahre (29Jahre*12Monate*4Byte = 1392Byte) im voraus das ablegen kann und mir so jegliche Berechnungen, insbesondere die komplexe für Ostern, auf dem EibPC sparen kann und das statt dessen wesentlich komfortabler auf einem PC erledigen kann. Soweit gehörte das aus meiner Sicht noch zum Thema. Aber dann fiel mir was auf (und da wurde es dann OT aber um es verständlicher zu machen wiederhole ich es noch einmal in anderen Worten):

                    Den u32 Wert für einen bestimmten Monat eines bestimmten Jahres per Index aus dem c1400 zu holen ist einfach (Index = ((aktuelles Jahr - erstes Jahr) * 12 + Monat -1) * 4), aber ein bestimmtes Bit über dessen Positionsnummer aus dem u32 zu holen ist offenbar weitaus schwieriger als ich mir das gedacht habe.

                    Das es dafür keine spezielle Funktion geben würde und ich es über eine Maske isolieren muss war mir klar. Aber das es auch keine Funktion gibt um aus einem gegebenen Index (heute wäre das beispielsweise 10) eine Maske zu erzeugen bei der das entsprechende Bit gesetzt ist (heute also das 10. womit die Maske also 0x00000400u32 lauten müsste) das ist mir erst jetzt aufgefallen. Normalerweise erzeugt man so was über 0x1u32 shift left 10 und praktisch jede Programmiersprache kann das irgendwie. Nur wie ich das beim EibPC machen soll, hier gibt es einfach kein Shift, das hat mir immer noch keiner beantwortet, dabei dachte ich, es wäre trivial und #18 nicht nur der erste sondern auch der vorletzte Beitrag, der sich damit beschäftigt, statt dessen drehen sich jetzt schon 7 Beiträge darum und immer noch ist keine Lösung in Sicht. Dabei war es doch nur ein ganz kleiner Teilaspekt einer möglichen Lösung der Frage wie sage ich möglichst einfach dem EibPC wann ein Feiertag ist.

                    Tut mir leid, das das jetzt schon so lange OT ist, ich hatte nicht damit gerechnet, das die Isolation eines Bits über seine Positionsnummer aufwendiger zu werden droht, als die Berechnung von Ostern. Wobei ich ja immer noch auf eine Lösung hoffe, damit meine Lösung mit einem Bit-Array auch einfach implementierbar wird.
                    Tessi

                    Kommentar


                      #25
                      Zitat von Tessi Beitrag anzeigen
                      Aber selbst das und ein Makro wäre ja zunächst in Ordnung, wenn ich wenigstens eine Funktion hätte für die gilt:
                      f(00)=0x0000000000000001
                      Du kannst Dir doch ein eigenes Funktions Makro bauen, dass das liefert. Aufgrund des Validierungskonzepts würde das für
                      s=u*f(2)
                      auch nur f(2) ein einziges mal bestimmen. Oder ich hab Dich nicht verstanden (?). Oder nochbesser: Mach Dir das Shift-Makro gleich selbst. Ginge doch auch. Du weisst schon, dass man inzwischen Makros programmieren kann, die sich wie eine Funktion anwenden lassen?
                      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                      Enertex Produkte kaufen

                      Kommentar


                        #26
                        Zitat von enertegus Beitrag anzeigen
                        Du weisst schon, dass man inzwischen Makros programmieren kann, die sich wie eine Funktion anwenden lassen?
                        Hoi

                        Ganz kurz, wo ist das beschrieben?
                        Grüsse Bodo
                        Fragen gehören ins Forum, und nicht in mein Postfach;
                        EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                        Kommentar


                          #27
                          Zitat von Bodo Beitrag anzeigen
                          Hoi
                          Ganz kurz, wo ist das beschrieben?
                          S. 246 (Handbuch EibStudio 2.311) - das Beispiel ist das cosh-Makro das wie eine eingebaute Funktion genutzt wird.
                          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                          Enertex Produkte kaufen

                          Kommentar


                            #28
                            Hoi Michael

                            Danke.
                            Grüsse Bodo
                            Fragen gehören ins Forum, und nicht in mein Postfach;
                            EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                            Kommentar


                              #29
                              Die Funktions-Makros finde ich großartig und ich würde sofort eines schreiben...

                              Aber wie kann ich die Funktion f(n) ohne eine Shift-Funktion sauber implementieren?
                              Alternativ könnte 2^n berechnet werden aber auch das geht nicht als u32 oder gar u64.

                              Also was sollte ich in das Makro hineinschreiben??

                              Das ist mein Problem!
                              Tessi

                              Kommentar


                                #30
                                Zitat von Tessi Beitrag anzeigen
                                Die Funktions-Makros finde ich großartig und ich würde sofort eines schreiben...
                                Das ist mein Problem!
                                Was spricht gegen:
                                [highlight=epc]
                                s=Wert*convert(pow(2f32,convert(Shifter),0f32),0u6 4)
                                [/highlight]
                                und dann halt schick verpacken z.b. in ein Makro
                                ShiftLinks(Wert,Shifter)
                                usw..
                                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                                Enertex Produkte kaufen

                                Kommentar

                                Lädt...
                                X