Diskussion:Unäres Minus

aus Wikipedia, der freien Enzyklopädie
Letzter Kommentar: vor 11 Jahren von 77.12.63.150
Zur Navigation springen Zur Suche springen

Die nicht vorhandene Bindungsstärke in der Mathematik wird als Grund angegeben, "weswegen dort das unäre Minus meist geklammert werden muss". Es geht hier, (-x)^n, jedoch um ein anderes als das bei den Programmiersprachen verwendete Beispiel, (-a)*x. Ich vermute, dass es auch bei allen Programmiersprachen (mit und ohne Bindungsstärke) entscheidend ist, ob -x^n oder (-x)^n geschrieben wird. Der Grund für die Klammersetzung bei dem mathematischen Beispiel kann jedoch "Punktrechnung vor Strichrechnung" oder wie hier "Potenzierung vor Punktrechnung" sein. Daher schlage ich vor:

"Diese unterschiedliche Bindungsstärke gilt jedoch nicht in der Mathematik. Beispiel:

bedeutet . Ist jedoch gemeint, muss dies explizit geklammert werden."

oder besser noch

"Diese unterschiedliche Bindungsstärke gilt jedoch nicht in der Mathematik. Beispiel:

bedeutet .

Ist jedoch gemeint, muss dies sowohl in Programmiersprachen als auch in der Mathematik explizit geklammert werden."

Meines Erachtens wurden bisher zwei Probleme unterschiedlicher Ebenen gemischt: einerseits Regeln für die maschinelle Umsetzung von Mathematik und andererseits mathematische Rechenregeln. --188.102.178.254 10:32, 18. Feb. 2013 (CET)Beantworten

Die Beispiele sind schon dieselben. Ob nun Multiplikation oder Potenz verwendet wird, ist egal, beides hat normalerweise Vorrang vor einem Minus, nur halt bei den Programmiersprachen nicht, wo ein unäres Minus Vorrang hat. Es entsteht nur ein Unterschied durch den Begriff „meist“ in „weswegen dort das unäre Minus meist geklammert werden muss“. Denn diese Klammerung ergibt für reelle Zahlen nur bei Potenzen einen Sinn (und auch dort nur wenn der Exponent keine ungerade ganze Zahl ist), während eh (-x)*y == -(x*y) gilt. Da es bei den genannten Programmiersprachen C, C++ und Java keinen Potenzoperator gibt, stellt sich die Frage dort nicht.
Es gibt aber dennoch eine Möglichkeit, durch Wahl von extremen Randbedingungen eine Testmöglichkeit zu schaffen:
public class UnaryMinus
{
  public static void main(String[] args)
  {
    int a=Integer.MIN_VALUE, b=Integer.MIN_VALUE;

    System.out.println("-a/b  ="+(-a/b));
    System.out.println("0-a/b ="+(0-a/b));
    System.out.println("(-a)/b="+((-a)/b));
    System.out.println("-(a/b)="+(-(a/b)));
  }
}

Ergebnis:

-a/b  =1
0-a/b =-1
(-a)/b=1
-(a/b)=-1
Bei dem Beispiel findet ein arithmetischer Überlauf statt, da -Integer.MIN_VALUE nicht mit int darstellbar ist und wieder Integer.MIN_VALUE ergibt. Dieser Überlauf findet nicht statt, wenn die Division zuerst stattfindet, das Ergebnis von a/b ist 1, da a==b, und eins kann man problemlos negieren. Man kann gut erkennen, dass der binäre Operator 0-x geringere, der unäre Operator -x dagegen höhere Priorität als die Division hat. Das Beispiel war jetzt Java, dürfte aber in ähnlicher Form in C/C++ umgesetzt das gleiche Ergebnis liefern. 77.12.63.150 10:57, 20. Feb. 2013 (CET)Beantworten