sin, cos, abs, min, max usw. keine Templates in C++???



  • Don't feed...



  • Jester schrieb:

    Welchen Vorteil hätte das template denn gegenüber der Überladung

    float sin(float);
    double sin(double);

    wenn ich einfach mal den sinus von nem int haben will und den auch als int wieder haben will? Gibt doch keiner einem das Recht für jemanden zu entscheiden "Braucht kein Mensch!". In C++ wird doch immer darüber geprallt mit Templates und co. aber hier wird es nicht getan - nur weil jemand mal denkt "Nö brauchen wir nicht"?

    @Tim.
    Halt dich einfach raus, wenn du nichts zum Thema zu sagen hast.



  • sinus user schrieb:

    wenn ich einfach mal den sinus von nem int haben will und den auch als int wieder haben will?

    Alles klar 🙄



  • sinus user: okay, du hast recht. ich wollte es (wie die anderen hier auch) nur nicht wahr haben. könntest du deine korrekturen beim standard-komitee einreichen? damit kann dieser makel an c++ endlich ausgemerzt werden.



  • Jester schrieb:

    sinus user: okay, du hast recht. ich wollte es (wie die anderen hier auch) nur nicht wahr haben. könntest du deine korrekturen beim standard-komitee einreichen? damit kann dieser makel an c++ endlich ausgemerzt werden.

    sarkasmus steht einer kompetenz wie deiner einfach nicht.

    Doch man muss einfach sagen (Ob es Sinn macht oder nicht), das dies nicht konsequenterweise für diesen Bereich und auch andere Bereiche auf Templates umgesetzt wurde. Nur weil Leute denken "Macht keinen Sinn" oder weil sie zu Faul dafür waren. Geht ums Prinzip.



  • Also entweder ich bin heute etwas schwer von Begriff (was ich nicht hoffen will ;)) oder du drückst dich immer noch unklar aus, aber ich verstehe immer noch nicht, wozu du da unbedingt ein Template benötigst. Und noch weniger verstehe ich, inwieweit dein seltsamer Template-"Workaround" dort besser sein sollte als die normale sin()-Funktion.



  • ich kann mit diesem workaround nun sin mit jedem datentyp ob int, char, float usw. benutzen was ich mit einer deklaration von nur float/double nicht kann.



  • sinus user schrieb:

    ich kann mit diesem workaround nun sin mit jedem datentyp ob int, char, float usw. benutzen was ich mit einer deklaration von nur float/double nicht kann.

    Nochmal: Klar kannst du die Funktion sin() mit jedem Datentyp verwenden, der eine implizite Konvertierung nach double erlaubt (und das trifft auf jeden Fall für alle eingebauten Zahlentypen von C++ zu). Mit deinem Template ersetzt du lediglich die implizite Konvertierung durch eine explizite Konvertierung.

    (und obendrein schneidest du dir selber Rechengenauigkeit ab, indem du runtergehst bis auf float)



  • wer sagt denn das ich rechengenauigkeit benötige und nicht nur die zahl die vor dem komma steht? wie schon gesagt: sinus ist nur ein beispiel, bei log kommt das evtl. noch was besser rüber.

    aber wenn ich

    z. B. folgenden code habe:

    int wert = 839245;
    wert = sin (wert);
    

    bekomm ich unter dem DevC++ und unter VC++2005 Express eine warnung wegen datenverlust, da der auf float konvertiert (da es eben kein Template für sin gibt). Mit meinem "workaround" bekomme ich dies nicht.



  • Erstens: Das hast du selber gesagt;)[quote="sinus user"]ich soll von long double auf float casten damit ichs benutzen kann und somit höhere ungenaugkeit erzielen? ist das nicht schwachsinn?

    Zweitens: Das einzige, was du mit deinem 'static_cast' erreicht hast, ist diese Warnung wegzudoktorn. Aber das ändert absolut nichts an dem Problem, auf das dich der Compiler hinweisen wollte. (btw, solange du keine Werte in der Größenordnung von INT_MAX verwenden willst, kannst du die Warnung problemlos ignorieren ;))



  • du als Moderator und C++ coder sagst ernsthaft "warnung ignorieren"???????



  • Ja, mache ich. Warnungen markieren zwar mögliche Fehlerquellen, aber wenn man weiß, was man da tut, kann man sie auch mal stehen lassen (und wie gesagt, solange sich deine Eingabewerte im überschaubaren Rahmen bewegen, ist dieser mögliche Genauigkeitsverlust auch nicht gefährlich - da sind mögliche Ungenauigkeiten IN der Sinus-Berechnung oft gravierender).

    (und dein Cast hat nur eine Auswirkung auf das Programm - er unterdrückt die Warnmeldung des Compilers)



  • ich denk mal da bleib ich doch lieber bei meinem workaround als warnings zu ignorieren.



  • sinus user schrieb:

    Jester schrieb:

    Welchen Vorteil hätte das template denn gegenüber der Überladung

    float sin(float);
    double sin(double);

    wenn ich einfach mal den sinus von nem int haben will und den auch als int wieder haben will?

    ROFL

    hier

    int sin(int) {
      return 0;
    }
    

    wenn du es so dringend brauchst 😉

    SCNR



  • Nochmal: Dein Workaound ist absolut kontraproduktiv - und wenn du ihn unbedingt brauchst, solltest du sowieso nach double casten anstatt nach float. Und du erreichst damit nur eins gegenüber der Standard-Variante: Du verbietest dem Compiler, dich auf mögliche Genauigkeitsverluste aufmerksam zu machen (und das ist effektiv auch nichts anderes als die Compilerwarnung zu ignorieren).

    Wenn mich der Compiler mit einer Warnung konfrontiert, habe ich normalerweise zwei Möglichkeiten, damit umzugehen:
    a) ich schau mir an, worauf er mich da hinweisen will (viele Warnungen deuten auf syntaktisch korrekte, aber semantisch unsinnige Konstrukte wie if(flag=0)... ) - und korrigiere das Programm
    b) ich ignoriere die Warnung, weil ich weiß, daß ich das genau so haben wollte (und in besonders hartnäckigen Fällen schalte ich die Warnung gleich komplett ab).



  • rüdiger schrieb:

    int sin(int) {
      return 0;
    }
    

    Hihi. Das geht dann als Least-Precision-Math-Library in den Standard ein 😃
    Ich hab auch noch eine Funktion beizusteuern:

    int cos (int x)
    {
        return x ? 0 : 1;
    }
    

    Und noch ein paar:

    int acos (int x)
    {
        if (x == 1) return 0;
        if (x == 0) return 1;
        if (x == -1) return 3;
        else return 1/0;
    ]
    
    int asin (int x)
    {
        if (x == 0) return 0;
        else return 1/0;
    }
    
    int atan (int x)
    {
        if (x > 2) return 1;
        if (x < 2) return -1;
        else return 0;
    }
    

    Nur der Tangens ist fieser, aber da darf der sinus-user gerne sein Workaround einsetzen 😉



  • @rüdiger
    irgendwie bist du dumm oder hast du noch nicht verstanden das ich sinus nur als beispiel genommen habe - wie ich es mehrfach schon erwähnt habe.

    @CStoll
    Okay ich caste nach double.

    @.filmor
    Auch wenn dein Post eigentlich nur Kontraproduktiv sein sollte, stelle ich dir jedoch mal trotzdem eine Frage: Warum sollte man z. B. acos oder atan nie als int haben wollen oder für einen anderen Datentypen? Nur weil genauigkeit drauf geht? so what?

    Mir würd da schon auf anhieb ein Beispiel für logs einfallen wo man schon mal auf die dezimalstellen pfeifen kann.



  • EDIT: ne, ich misch mich doch net ein, sry



  • sinus user: Hier liegt doch überhaupt kein Fall von parametrischem Polymorphismus vor. Der Algorithmus, der den Sinus berechnet, sieht für jeden Datentyp anders aus. Du müsstest alle Instanziierungen durch explizite Spezialisierung herstellen. Es mag da subtile Unterschiede geben, aber eigentlich ist für solche Fälle Überladung gedacht. Falls dir das klar ist, würde ich gerne wissen, warum genau du das so haben willst.



  • sinus user schrieb:

    @rüdiger
    irgendwie bist du dumm oder hast du noch nicht verstanden das ich sinus nur als beispiel genommen habe - wie ich es mehrfach schon erwähnt habe.

    ... was aber völlig irrelevant ist. Die trigonometrischen Funktionen machen ausnahmslos alle keinen Sinn auf Ganzzahlen.

    sinus user schrieb:

    Auch wenn dein Post eigentlich nur Kontraproduktiv sein sollte, stelle ich dir jedoch mal trotzdem eine Frage: Warum sollte man z. B. acos oder atan nie als int haben wollen oder für einen anderen Datentypen? Nur weil genauigkeit drauf geht? so what?

    Wie gesagt, keine der trigonometrischen Funktionen ist über |Z sinnvoll.

    sinus user schrieb:

    Mir würd da schon auf anhieb ein Beispiel für logs einfallen wo man schon mal auf die dezimalstellen pfeifen kann.

    In der Tat, der Logarithmus kann auf unsigned(!) int sinnvoll sein. Aber nicht auf allen oder einem großen Anteil der Datentypen. Und deshalb macht man aus ihm kein Template, sondern überlädt.


Anmelden zum Antworten