Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
ABS berechnen ohne Wurzel, Quadrat und IF/THEN
Krumnix
myCSharp.de - Member



Dabei seit:
Beiträge: 124
Herkunft: Schweiz

Themenstarter:

ABS berechnen ohne Wurzel, Quadrat und IF/THEN

beantworten | zitieren | melden

Hallo,

hab hier einen Controller, welcher nur die Grundrechenarten unterstützt.
Nun würde ich gerne den absolut Betrag errechnen.

Da die Software nur Templates ermöglicht (was sowas ähnliches wir Funktionen wäre), diese aber als reines suchen/ersetzen funktionieren (bedeutet, dass das Programm nachher aus einer "Mega-Main" besteht) wird die Sache recht kompliziert.

Ich möchte das Template "ABS" erstellen und dieses auf in IF verwenden.
Daher ist das verwenden von IF im ABS Template nicht möglich ->
IF(.... IF(...)) -> Compilerfehler.

Jedoch erlaubt der Compiler das Rechnen in einer IF-Abfrage ->
IF (a+b >> 10)... -> Ok

Wie kann ich nur mit den Grundrechenarten ein ABS umsetzen?
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4193

beantworten | zitieren | melden

Das funktioniert nicht, nur mit den Grundrechenarten, denn Betragsfunktion (abs) ist ja über eine Fallunterscheidung definiert.
Kennt die Software denn den ?-Operator:

x ≥ 0 ? x : -x
?
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Der ?-Operator ist auch nur Syntax-Zucker für ein if.
Nur mit Grundrechenarten aber sehe ich keine Chance. Wenn Bitoperationen gehen, dann schon.

LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
Krumnix
myCSharp.de - Member



Dabei seit:
Beiträge: 124
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

Bit-Schieben hab ich mir auch schon überlegt, aber wie kann ich das in einem Rutsch umsetzen, ohne die Möglichkeit der Zwischenspeicherung?
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5992
Herkunft: Leipzig

beantworten | zitieren | melden

Siehe die Antwort in How to compute the integer absolute value
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7581
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Krumnix,

für int


private static int Abs(int v)
{
    int mask = v >> 4 * (32 - 1);
    return (v + mask) ^ mask;
}
(sollte sich auf "jede" Programmsprache übertragen lassen). Funktionieren tut es wegen der (binären) Darstellung von Ganzzahlen. Solange der µC eine Zweierkomplement-Darstellung für negative Zahlen verwendet, klappt das.

Edit: im Link von MrSparkle sind ähnlich Varianten.
Zitat
ohne die Möglichkeit der Zwischenspeicherung?
Das verstehe ich nicht. Was meinst du damit?


mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers