Absolutwert berechnen
-
Hi,
Höffentlich kann jemand auf Frage beantworten:
wie man das vorzeichen besser abfragt als, sprich den
absolutwert bekommt:if (value < 0)
{
value = -value;
}LG!
-
/* Liefert den Betrag einer Zahl zurück. */ inline __int64 abs(__int64 x) { return (x < 0i64) ? (-x) : (x); }
Ist aber im Prinzip das selbe. Anders geht es meines Wissens nach auch nicht.
-
Und was ist __int64? Irgendwie finde ich dein Beispiel seltsam.
aber was ist mit std::abs aus <cstdlib>?
-
__int64 == [Insert your favourite Data Type here]
Der Grund warum ich __int64 nehme, liegt doch auf der Hand: Für die meisten anderen Datentypen gibt es diese Funktion bereits.
-
hm, was wenn man nur <0 schreiben würde?
-
0i64 steht jetzt nur wegen __int64 da.
Bei int heisst es natürlich 0, bei float 0.0f usw.
-
Passt jetzt nicht zum Thema, aber was hat es eigentlich mit diesem __int64 auf sich?
Ich hab das jetzt schon öfters gesehen, sehe aber den Sinn darin nicht ganz,
da es diesen Datentyp ja nicht im Standard gibt und Programme somit nicht portabel sind.Also bitte, klärt mich auf
gruß,
walker
-
Hi,
wenn es im Standard festgelegt ist, welches das Vorzeichenbit ist, könnte man dieses gezielt setzen, aber viel schneller wird das nicht sein, man spart nur das eine if().
ChrisM
-
Optimizer schrieb:
0i64 steht jetzt nur wegen __int64 da.
Bei int heisst es natürlich 0, bei float 0.0f usw.? Bist Du der Meinung, daß »12.9f > 0« einen Compilerfehler liefert?
-
Hab ich das behauptet? Trotzdem vergleiche ich gerne gleiche Datentypen miteinander.
Dafür möchte ich mich jetzt in aller Form entschuldigen.
-
walker schrieb:
Passt jetzt nicht zum Thema, aber was hat es eigentlich mit diesem __int64 auf sich?
__int64 beim MSVC ist so etwas wie long long beim gcc oder in neueren MSVC-Versionen. Im Prinzip ist es eine Notlösung für die Fälle in denen ein long nicht ausreicht und sollte in Codes die portierbar sein sollen möglichst gemieden oder umgetypedefed (geiles Wort
) werden, damit man zentral einen anderen Datentyp auswählen kann, falls __int64 nicht bekannt ist. Irgendwie scheint __int64 aber Optimizers Lieblingstyp zu sein.
-
Optimizer schrieb:
Hab ich das behauptet? Trotzdem vergleiche ich gerne gleiche Datentypen miteinander.
template<class T>bool f(T t) { return T(0) > t; }
?
-
MaSTaH schrieb:
[...]Irgendwie scheint __int64 aber Optimizers Lieblingstyp zu sein.
Ne, nur für große Zahlen.
Weil "long long" ist (sorry) echt Verarschung. So wie schon long eine Verarschung ist, da fast immer genauso groß wie int.
Vielleicht gibts ja irgendwann ein 128 Bit-typ und der heisst dann "extrem long long"
Außerdem ist glaub ich auch bei long long die Größe nicht festgelegt, bei __int64 schon.@Daniel: Das ist sicher die beste Lösung, eine Zahl zu vergleichen. Und was willst du mir jetzt mit deinem Fragezeichen mitteilen? Mir ist nicht bewusst, dass ich in obiger Funktion irgendwas falsch gemacht habe, falls doch, dann teile mir das doch bitte in deutscher Sprache mit. :p
-
template<typename T> T abs(T t) { return T(0) > t ? -t : t; }
Finde ich besser, schließlich will ich ja den Absolutwert und nicht wissen ob
es größer oder kleiner null ist.
-
Optimizer schrieb:
@Daniel: Das ist sicher die beste Lösung, eine Zahl zu vergleichen. Und was willst du mir jetzt mit deinem Fragezeichen mitteilen?
Ich wollte wissen, ob es Leute gibt, die solchen Code erzeugen; wer einfachste Typenumwandlungen nicht auf einen Blick durchschaut, der sollte lieber Tennis spielen, als programmieren. Sowas ist etwa die gleiche Größenordnung wie "sizeof(char)", "double(1)+3.14159" oder "/* now we add one and two an save the result in res */ res = 1 + 2;".
Mir ist nicht bewusst, dass ich in obiger Funktion irgendwas falsch gemacht habe,
Es ist genausowenig falsch, wie seine Suppe aus einem eigens dafür ausgehobenen Loch im Knie zu schlürfen. Das ist allerdings überflüssig und tut weh, wie auch das Lesen einer solchen Codezeile.
Weil "long long" ist (sorry) echt Verarschung. So wie schon long eine Verarschung ist, da fast immer genauso groß wie int.
Nein. Was können die Normierungsorganisationen dafür, wenn sich dein Weltbild auf intelkompatible Personalcomputer beschränkt?
-
Du brauchst mir nicht zu unterstellen, dass ich Sachen wie 15.3f > 0 nicht durchschauen würde.
Und es ist auch nicht "überflüssig und tut weh", weil ich es für guten Stil halte, Typkonversionen, auch implizite, zu minimieren. Punkt.
Gegen den Vergleich mithilfe von Templates habe ich ja nichts. Ich habe auch nicht gesagt, dass das die ultimative Lösung für alles ist, sondern dass meine Funktion ein Beispiel ist, das sich auf andere Typen übertragen lässt, da die Frage sehr allgemein formuliert war. Da muss man nicht gleich mit einem Template antanzen, aber vielleicht auch nicht mit int, wo es schon ein passendes abs gibt.Nein. Was können die Normierungsorganisationen dafür, wenn sich dein Weltbild auf intelkompatible Personalcomputer beschränkt?
Wieder eine unsachliche Unterstellung. Dabei habe ich extra noch gesagt, dass bei long und long long keine bestimmte Größe festgelegt ist und ich u.a. aus diesem Grund __int64 gegenüber long long vorziehe.
Da du meine Postings offenbar nur zur Hälfte grob überfliegst und sich deine ganzen Postings bisher auf falsche Unterstellungen und Aussagen wie
? Bist Du der Meinung, daß »12.9f > 0« einen Compilerfehler liefert?
beschränken, sehe ich keinen Sinn darin, die Diskussion fortzusetzen.
-
Optimizer schrieb:
Du brauchst mir nicht zu unterstellen, dass ich Sachen wie 15.3f > 0 nicht durchschauen würde.
Das habe ich nicht getan (su).
Und es ist auch nicht "überflüssig und tut weh", weil ich es für guten Stil halte, Typkonversionen, auch implizite, zu minimieren. Punkt.
Fragezeichen. Es geht doch ganz allgemein darum, etwas "Mathematik" in C++ abzubilden. In "Mathematik" sage ich "a < 0", und genau das will ich in C++ auch sagen. Du bist nun aber offenbar der Meinung, daß man die 0 verändern müsse, wenn a nun auf einmal ein reelle-Zahlen-Imitat wie double wird. Ich darf also einmal Copy&Paste auf meinen Quelltext anwenden, wenn ich von int auf double umstelle?
Nein. Was können die Normierungsorganisationen dafür, wenn sich dein Weltbild auf intelkompatible Personalcomputer beschränkt?
Wieder eine unsachliche Unterstellung.
Nein. Mit Systemen, die ich zu sehen bekomme, ist das int öfter short als long.
Dabei habe ich extra noch gesagt, dass bei long und long long keine bestimmte Größe festgelegt ist und ich u.a. aus diesem Grund __int64 gegenüber long long vorziehe.
Es sind ja Minimalwertebereiche festgelegt; ich halte mehr davon, einen existierenden Typ einem nichtexistierenden vorzuziehen. Jedem Tierchen sein Pläsierchen.
Da du meine Postings offenbar nur zur Hälfte grob überfliegst und sich deine ganzen Postings bisher auf falsche Unterstellungen und Aussagen wie
? Bist Du der Meinung, daß »12.9f > 0« einen Compilerfehler liefert?
beschränken, sehe ich keinen Sinn darin, die Diskussion fortzusetzen.
Du hast offenbar ein Problem damit, Textaussagen zu verstehen. Ich ziehe es vor, Antworten kurz zu formulieren. Daß ich dabei nur das Thema anspiele, liegt auf der Hand. Wenn Du nicht dazu fähig sein solltest in meinem Text ein "Warum? Gibt es dafür technische Gründe?" zu erkennen, dann tut mir das wirklich leid. So war es aber gemeint.
-
? Bist Du der Meinung, daß »12.9f > 0« einen Compilerfehler liefert?
Das war dein erster Beitrag. Kannst du daraus im gegebenen Zusammenhang eine Frage nach technischen Gründen und dem Hinweis, dass es vielleicht für dein Copy & Paste genehmer ist, rauslesen?
Ich nicht. Das sind eben die Probleme bei Beiträgen, die aus 8 Worten, einem Satz und 2 Fragezeichen bestehen. Zum Glück bist du gegen Ende jetzt etwas ausführlicher geworden.
btw, wie gesagt, bei mir ist das eine Stilfrage und nicht, ob C&P leicht geht.Nein. Mit Systemen, die ich zu sehen bekomme, ist das int öfter short als long.
Die "unsachliche Unterstellung" war nicht, dass es solche Systeme nicht gibt, sondern dass du meinst, mein Weltbild sei beschränkt auf solche, wo das nicht der Fall ist.
Es sind ja Minimalwertebereiche festgelegt; ich halte mehr davon, einen existierenden Typ einem nichtexistierenden vorzuziehen. Jedem Tierchen sein Pläsierchen.
Ok, lassen wir es mal dabei. Das führt sonst zu einer Glaubensfrage.