Größen mit Maßeinheiten - wie speichern?



  • Ich finde nicht dass die Antwort hier so klar (2) ist.

    Die Sache mit den Winkeln ist äusserst doof.
    z.B. schonmal deswegen weil die Periode von sin / cos 2 Pi ist, aber 2 Pi blöderweise nicht als float / double darstellbar ist.
    Wenn man exakte Ergebnisse braucht nervt das.

    Bei 3600000090 Grad ist klar dass der Sinus 1 ist. Bei Modulo 360 kommt exakt 90,0 raus, und dass der Sinus davon exakt 1,0 ist wissen wir.
    Bei 20000000,5*Pi Radianten modulo 2 Pi kommt dagegen bloss was raus was relativ nahe an 0,5 Pi liegt -- allerdings nicht so nahe an 0,5 Pi wie es mit der verwendeten Gleitkommadarstellung sein könnte. => sin() davon wird nicht exakt 1,0 sein. => Doof.


  • Mod

    20000000,5*Pi Radianten

    Speichern wir Radians nicht direkt als Vielfaches von Pi? Warum also den Faktor noch drinbehalten? Man kann das *Pi doch implizit machen.

    Ich würde zu 1 tendieren, und dann einfach kontextabhängig das sinnvollste benutzen. Wenn man sehr viel mit Grad rechnet, so sollte man auch für diesen Fall Grad abspeichern.

    Und nicht UDLs vergessen!



  • Arcoth schrieb:

    Wenn man sehr viel mit Grad rechnet, so sollte man auch für diesen Fall Grad abspeichern.

    Hä?

    ps: Seltsam, daß keiner verlangte, man müsse es unbedingt ähnlich wie im C++-Standard machen.
    http://en.cppreference.com/w/cpp/chrono/duration

    //an dem tag haben sie wieder was geraucht
    

  • Mod

    volkard schrieb:

    Arcoth schrieb:

    Wenn man sehr viel mit Grad rechnet, so sollte man auch für diesen Fall Grad abspeichern.

    Hä?

    ... wenn du sehr oft - nach Berechnungen - Funktionen aufrufst, die einen double mit der Gradzahl erwarten (könnten aus irgendeiner API stammen), wirst du natürlich deine Berechnungen, falls sinnvoll, vorzugsweise in Grad durchführen und speichern damit du nicht bei jedem Aufruf ins Bogenmaß konvertieren musst.



  • Arcoth schrieb:

    ... wenn du sehr oft - nach Berechnungen - Funktionen aufrufst, die einen double mit der Gradzahl erwarten (könnten aus irgendeiner API stammen),

    Ahh.
    Ok, kann nicht vorkommen.


  • Mod

    Ahh.
    Ok, kann nicht vorkommen.

    Wie man merkt bin ich ein Greenhorn, danke für die Aufklärung. 🕶

    Seltsam, daß keiner verlangte, man müsse es unbedingt ähnlich wie im C++-Standard machen.

    Willste für jede Maßeinheit eine Spezialisierung haben? Und Konstanten (zur Konvertierung etc.) als Template-Parameter nehmen?



  • hustbaer schrieb:

    allerdings nicht so nahe an 0,5 Pi wie es mit der verwendeten Gleitkommadarstellung sein könnte. => sin() davon wird nicht exakt 1,0 sein. => Doof.

    Ähm.
    Schon, wenn man eine Zahl durch 3 teilt und danach das Dreifache nimmt, hat man einen Rechenfehler. Mit der Gradrechnung kommste wohl auf ein geschlossenes Dreieck, Viereck, Fünfeck, Sechseck, aber das Siebeneck ist schon offen. Und auch nur FALLS jemand die glatten Sonderfälle in die sin()-Funktion einprogrammiert. Na, besser in double auch, damit sqrt(2)*sqrt(.5)==1. sin(30d) solls nicht besser haben als sin(60d), oder?



  • Arcoth schrieb:

    Und nicht UDLs vergessen!

    Ja, die sind für die Lesbarkeit ganz wichtig. 🤡
    d für grad, ist klar. g für neugrad und r für normal. WIe im Taschenrechner üblich.
    außerdem universell m für milli und k für kilo, aus der Zeit-Lib noch s für Sekunde und m für minute.
    1m ist eine Minute.
    1mm ist eine Milliminute (ungefähr ein clocktick in DOS). Ach nee, das geht ja so nicht.
    Man muss UDLs aneinanderhängen können. Das ist der einzige Ausweg, um nicht in eine kombinatoreische Explosion zu geraten.
    1m m ist eine Milliminute.
    1k g sind 1000 Grad.
    Dann wünschen die Benutzer aber auch, mehr Leerzeichen verwenden zu dürfen. Gibt ja so kranke Leute, die keine zwei Zeilen Code hinkriegen ohne eine Leerzeile dazwischen und keinen Ausdruck ohne Leerzeichen um alle Operatoren).
    1 m m ist eine Milliminute.
    1 k g sind 1000 Grad.
    Und Variablen!
    x m m steht einfach für Minute(Milli(x)).
    Und weils zu kacke aussieht, muss man auch die Leerzeichen weglassen können. Am besten mit Vorrangregelung für übliche Zusammensetzungen.
    1m m oder 1 m m oder (1m)m ist eine Milliminute, aber 1mm oder 1 mm ist ein Millimeter. Siehe auch whitespace overloading.

    Übung: Wie sieht die Einheit des Benzinverbrauchs von Autos aus, wenn man nur Einheitenvorsätze wie milli und SI-Basis-Einheiten erlaubt und vielleicht noch ein i für "hoch minus 1" und man meistens Zahlenwerte zwischen 1 und 1000 haben mag?



  • volkard schrieb:

    g für neugrad

    Wird das denn wirklich irgendwo eingesetzt?



  • oenone schrieb:

    volkard schrieb:

    g für neugrad

    Wird das denn wirklich irgendwo eingesetzt?

    Wäre mir neu, daß die Vermesser was anderes nehmen.
    edit: http://www.hs-bochum.de/fb5/baeumker/download/vermessungskundes1-36einseitig.pdf


Anmelden zum Antworten