sin, cos, abs, min, max usw. keine Templates in C++???
-
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 wieif(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.
-
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.Wenn ich mir ein sin für Integer gewünscht hätte, wäre ich vorsichtig damit andere Leute als dumm zu bezeichnen :p
-
.filmor schrieb:
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.
gibt es dafür nicht template spezialisierung?
@rüdiger:
Du bist dumm, da du dich noch immer an dem Beispiel von sinus festklammerst.
-
sinus user: du bist dumm.
-
sinus user schrieb:
.filmor schrieb:
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.
gibt es dafür nicht template spezialisierung?
Nein. Die Template-Spezialisierung ist dafür da, in einigen wenigen Spezialfällen unter vielen allgemeinen etwas angepasst durchzuführen. Mathematische Funktionen funktionieren aber generell nur auf Zahlentypen und bei denen auch meistens nur auf "reellen" Zahlen (denen double und float noch am nächsten kommen). Also hast du eben nicht viele allgemeine Fälle sondern nur 3 (oder 6, wenn du die komplexen Zahlen noch hinzunimmst), nämlich die Fließkommatypen float, double und long double.
-
.filmor schrieb:
Die trigonometrischen Funktionen machen ausnahmslos alle
keinen Sinn auf Ganzzahlen.machen sie wohl.
z.b. wenn man keine foating point hardware hat und emulierte floats zu lahm sind.
--> http://www.allegro.cc/manual/api/fixed-point-math-routines/

-
@pale dog: fixkommazahlen sind keine integers. sie werden bloss als integers dargestellt.
-
Lies dir meinen Satz durch. Ich schrieb bewusst Ganzzahlen und |Z und nicht Integer-Typen.
-
hustbaer schrieb:
@pale dog: fixkommazahlen sind keine integers. sie werden bloss als integers dargestellt.
weiss ich, der unterschied ist aber verschwindend gering

-
sinus user schrieb:
Jester schrieb:
Weil Du sin schreiben sollst und nicht sin<int> es gibt kein Funktionstemplate für sin weil es keinen Sinn machen würde.
Der Sinn sei mal dahingestellt, aber es fehlt - Stimmts oder stimmts nicht, das es fehlt?

Warum fehlt eine Registrierkasse an Deinem Fahrrad ? Das ist ja total bescheuert - wer hat sich denn so was Blödes und Inkonsistentes wie den Strassenverkehr ausgedacht ?Sag nicht, dass sie nicht fehlen würde: Sie ist nicht da, oder ? Also fehlt sie !!!
Gibs zu !!!

@C++: Man sollte auch sofort open() für ints mitdefinieren ! Warum sollte das nur für streams geben ? Was, wenn jemand mal ein int öffnen möchte ? Und nicht vergessen, dieses blöde Overloading abzuschaffen ! Da sieht man ja gar nicht mehr, welche Funktion nun aufgerufen wird !!!
Gruß,
Simon2.
-
hi, vielleicht sollte man einfach mal in math.h nachschauen, für sin(x) gibt s da
den double sin(double) (kein long double im Standard). Auf float casten is da nix, nein, ist doch Unfug, dieser float cast. wer längere sinuse braucht, schreibt sich den selbst oder nimmt GMP und konsorten.
vg. tesu
ps: und der Scott Meyers ist doch auch nur ein träumer
edit: bei tangens machen ganzzahlen doch bestimmt sinn, oder? Trigonometrische Funktionen und BCD Codierung vertragen sich aber nicht !
-
tesuji schrieb:
ps: und der Scott Meyers ist doch auch nur ein träumer
der hat mehr drauf als du es je haben wirst