Vorzeichen einer Variable ändern
-
Hallo,
ich habe eine float variable. Je nach Situation ist diese Variable entweder positiv oder negativ. Wie kann ich das Vorzeichen dieser Variable nun ändern, so dass es je nach Wunsch immer positiv oder negativ ist. ich habe auch schon an eine if abfrage gedacht aber es muss doch einen Befehl dazu geben. Wenn nicht werde ich es notfalls auch mit einer if Abfrage machen.
-
Versteh ich das richtig, du hast eine Variable, die irgendein Vorzeichen hat. Und jetzt ist, unabhängig von diesem Vorzeichen, aber abhängig von irgendwelchen anderen Bedingungen, mal die negative, mal die positive Version gefragt?
#include <cmath> ... float x = ... // Vorzeichen unbekannt und egal float y; if (soll negativ sein) y = -std::abs(x); // abs ist die Betragsfunktion else y = std::abs(x);
-
float var(var > 0.0 ? -var : var);Für negative Werte und äquivalent für positive Zahlen ... was willst de da ne große Funktion von machen?

inline float negate(float const& data){ return (data > 0.0f ? -data : data); }
-
Schreib dir lieber zwei Funktionen die deutlich machen was die ganze Aktion überhaupt soll:
template <typename T> inline T make_pos( T const& t ) { return t < 0 ? -t : t; } template <typename T> inline T make_neg( T const& t ) { return t < 0 ? t : -t; }
-
(D)Evil schrieb:
was willst de da ne große Funktion von machen?

Warum um Himmels willen sollte man keine Funktion draus machen? Die Funktion hat nahezu nur Vorteile.
-
Ich bezweifle, dass make_neg irgendeinen Vorteil gegenüber -abs hat.
-
y=-sqrt(pow(x,2));
-
Bashar schrieb:
Ich bezweifle, dass make_neg irgendeinen Vorteil gegenüber -abs hat.
Es liest sich wesentlich deutlicher als
-std::abs.Darüber hinaus, auch wenn man diese Anwendungsfälle aus dem OP höchstens erahnen kann: man kann bestehende Datenmengen wesentlich simpler via
std::transformbearbeiten, und stattif elseeinen Funktionszeiger als Input bzw. Outputfilter verwenden.
-
Jo ... :xmas2: Performance pur!!!
-
finix schrieb:
Bashar schrieb:
Ich bezweifle, dass make_neg irgendeinen Vorteil gegenüber -abs hat.
Es liest sich wesentlich deutlicher als
-std::abs.Ja klar, irgendwelche privaten Hilfsfunktionen sind besser lesbar als Standardfunktionen.
-
Bashar schrieb:
Ja klar, irgendwelche privaten Hilfsfunktionen sind besser lesbar als Standardfunktionen.
Ich meinte zwar ursprünglich vor allem (D)Evil, aber, ja: eine prägnant benannte, private Hilfsfunktion lässt sich leichter lesen als ein equivalenter Ausdruck der nur Standardfunktionen enhält.
Wenn dieser Ausdruck wirklich nur an einer einzigen Stelle im Programm vorkommt, dann würde ich wohl auch zu deiner Variante greifen, auch wenn ich hier tendenziell dem ternären Operator den Vorzug gäbe; andernfalls stelle ich mir ganz klar die Funktionen zur Verfügung.
-
finix schrieb:
Bashar schrieb:
Ja klar, irgendwelche privaten Hilfsfunktionen sind besser lesbar als Standardfunktionen.
Ich meinte zwar ursprünglich vor allem (D)Evil, aber, ja: eine prägnant benannte, private Hilfsfunktion lässt sich leichter lesen als ein equivalenter Ausdruck der nur Standardfunktionen enhält.
Wenn dieser Ausdruck wirklich nur an einer einzigen Stelle im Programm vorkommt, dann würde ich wohl auch zu deiner Variante greifen, auch wenn ich hier tendenziell dem ternären Operator den Vorzug gäbe; andernfalls stelle ich mir ganz klar die Funktionen zur Verfügung.
(rant on)
Also was ist einfacher zu lesen & verstehen,-std::abs(v)oder(v > 0 ? -v : v)? Hmmm...
Und was ist hier einfacher:std::standard_funktion(v)oderselbstbenannte_funktion_mit_komischem_namen_der_finix_logisch_vorkommt_aber_nix_aussagt(v)? Hmmm.Nur weil du denkst dass "make_neg" eine "prägnant benannte, private Hilfsfunktion" ist heisst das noch lange nicht dass andere das auch denken, und auf den ersten Blick verstehen was "make_neg" heissen soll.
Ich kenne Code der von Leuten geschrieben wurde die (vermute ich mal) ähnlich denken wie du, und ich hasse es solchen Code zu lesen.Nenn die Funktion wenigstens "negative_absolute_value" oder sowas, wenn du schon umbedingt eine (IMO sinnfreie) private template Hilfsfunktion verwenden willst. Und implementiere sie bitte über
-std::abs(v), kein Grund kryptisch zu werden für sowas einfaches.
(rant off)
-
Hallo,
es gibt eine Standardfunktion für minus, operator-, schreibt man meist schlicht -. Es gibt eine Standardfunktion für den Absolutwert std::abs. Damit erscheint mir -std::abs eigentlich eine recht gute Bezeichnung zu sein. Und wenn mir das tatsächlich zu kompliziert wäre, dann würde ich mich wohl an den Namen der Standardfunktionen orientieren und neg_abs oder ähnliches verwenden.
-
hustbaer schrieb:
(rant on)
Auf sowas muss ich glaube ich nicht unbedingt antworten

-
HumeSikkins schrieb:
Hallo,
es gibt eine Standardfunktion für minus, operator-, schreibt man meist schlicht -. Es gibt eine Standardfunktion für den Absolutwert std::abs. Damit erscheint mir -std::abs eigentlich eine recht gute Bezeichnung zu sein.Das ist für sich allein gestellt sicher richtig.
Allerdings ist
-std::abskeine Bezeichnung sondern ein Ausdruck. Er ist keineswegs lesbarer alsneg_absund lässt sich nicht speichern.