Laden...

ABS berechnen ohne Wurzel, Quadrat und IF/THEN

Erstellt von Krumnix vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.108 Views
K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 3 Jahren
ABS berechnen ohne Wurzel, Quadrat und IF/THEN

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?

4.931 Beiträge seit 2008
vor 3 Jahren

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

?

3.003 Beiträge seit 2006
vor 3 Jahren

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)

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 3 Jahren

Bit-Schieben hab ich mir auch schon überlegt, aber wie kann ich das in einem Rutsch umsetzen, ohne die Möglichkeit der Zwischenspeicherung?

5.657 Beiträge seit 2006
vor 3 Jahren

Weeks of programming can save you hours of planning

6.911 Beiträge seit 2009
vor 3 Jahren

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.

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!"