<div dir="ltr">That is the case because brackets have higher precedence... these are the rules that you leaned in primary school (BEDMAS -- Brackets, exponentiation, division, multiplication, addition and subtraction).  So (-x)^n is expressed as (-x)*(-x)*....*(-x) n times (if n is even then positive, if odd negative).  By the same logic -x^n  is -(x*x*...*x).  Swift doesn&#39;t consider spacing important in terms of precedence else 2+3 * 4  would equal 20 in which case I wouldn&#39;t have even made the original bug report or started this e-mail.  There is no concept of spacing in expressing an equation in math.  Again having negation (using computer science speak unary minus aka the prefix operator - ) having precedence over any other operator by default is a mistake and limits the utility of operator overloading in the language.<div><br></div><div>Best regards,</div><div>Jason </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 18, 2016 at 7:51 AM, Jeremy Pereira <span dir="ltr">&lt;<a href="mailto:jeremy.j.pereira@googlemail.com" target="_blank">jeremy.j.pereira@googlemail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I think I disagree with you.<br>
<br>
It is true that in mathematics people generally write (-x)^n to raise -x to the nth power but the notation of exponentiation (i.e. the n is a superscript to the x) makes it look like a postfix operator that binds more tightly than the negation. The general rule in Swift is that pre- and postfix have higher precedence and I don’t think this should be changed just because they do it slightly differently in maths. There’s no equivalent visual cue to superscripting that can make it look like ** binds more tightly than unary minus and I think people who are used to Swift conventions will find it confusing, especially considering that exponentiation is just one of an infinitude of possible binary operators.<br>
<br>
Furthermore, many people including myself like to put spaces around our binary operators. So you can argue that<br>
<br>
    -3**2<br>
<br>
should be -9 (although according to Swift conventions, it obviously is not) but what about<br>
<br>
    -3 ** 2<br>
<br>
To me, that reads as (-3)**2 pretty unambiguously.<br>
<br>
You could argue that I should change my formatting conventions in the case of higher-than-prefix-precedence binary operators but<br>
<br>
    -3**-2<br>
<br>
and<br>
<br>
    someOptional!**2<br>
<br>
won’t even compile. You need to put the spaces in so that Swift can identify the operators.<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; On 17 Jan 2016, at 18:19, Jason Nielsen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; I&#39;m afraid that is not a correct statement.  There is no arguing that -3^2 is -9 and that -3^2 and 0-3^2 are equivalent mathematically.  Exponentiation has higher precedence than - and subtraction is definitely an operator so -3^2 != (-3)^2.   That swift has decided that -3 is different than 0 -3 (which is an error) is a language design choice which I think is not a good one (just my opinion of course).  I can&#39;t think of any other language that is used for numerics R, matlab, python etc. that makes spacing like this significant).  I realize that you are saying that -3 is a negative number but what is a negative number by definition?  This is all strange to me.. if you type -3 at the REPL you get -3 if you type +3 you get an error.  So +3 isn&#39;t a positive number?<br>
&gt;<br>
&gt; Best regards,<br>
&gt; Jason<br>
&gt;<br>
&gt; On Sun, Jan 17, 2016 at 11:48 AM, David Sweeris via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt; In that context, I would say 9 is the correct answer. Mathematically speaking, the &quot;-&quot; is part of the number, not an operator.<br>
&gt;<br>
&gt; At least I think that&#39;s how it worked last time I was in math class.<br>
&gt;<br>
&gt; - Dave Sweeris<br>
&gt;<br>
&gt; On Jan 17, 2016, at 08:24, Maximilian Hünenberger via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; It&#39;s true prefix operators have the highest precedence (like ∞) but it should be lower so `-3**2` gets mathematically correct evaluated to `-9` if such an expression appears.<br>
&gt;&gt;<br>
&gt;&gt; - Maximilian<br>
&gt;&gt;<br>
&gt;&gt; Am 17.01.2016 um 02:36 schrieb 肇鑫 &lt;<a href="mailto:owenzx@gmail.com">owenzx@gmail.com</a>&gt;:<br>
&gt;&gt;<br>
&gt;&gt;&gt; I think they are already the highest precedence. That why they need not to be set this property.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Also, I think things like<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; print(-3**2)<br>
&gt;&gt;&gt; print(0-3**2)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; should never appear in Swift. As it is hard for human to read.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; zhaoxin<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Sun, Jan 17, 2016 at 5:21 AM, Maximilian Hünenberger &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt; +1 for me and as far as values go:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; prefix -<br>
&gt;&gt;&gt; precedence 150, same as infix * since it is essentially (-1)*<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; prefix +<br>
&gt;&gt;&gt; same as prefix -<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; To break the least amount of code:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; prefix !<br>
&gt;&gt;&gt; precedence 140, which is higher than any other Bool operator (== is highest with 130)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; prefix ~<br>
&gt;&gt;&gt; precedence 170, which is higher than any other binary operator (&lt;&lt; is highest with 160)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt; Am 16.01.2016 um 16:30 schrieb Jason Nielsen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;:<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; Hi all,<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; My proposal is to add a precedence option for prefix and postfix operators.  It is great that swift allows for associativity and precedence for binary operators but it hasn&#39;t quite gone all the way to make operator overloading fully functional (just an opinion).  To illustrate consider the following code:<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; import CoreFoundation<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; infix operator ** { associativity right precedence 200 }<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; func ** (base: Double, power: Double) -&gt; Double {<br>
&gt;&gt;&gt; &gt;     return pow(base, power)<br>
&gt;&gt;&gt; &gt; }<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; print(-3**2)<br>
&gt;&gt;&gt; &gt; print(0-3**2)<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; which prints 9 and -9.  In the first case because unary minus has higher precedence as a prefix operator it evaluates to (-3)*(-3) and the second because - is viewed as a binary operator of lower precedence as (0-(3*3).  Exponentiation has higher precedence than subtraction so -3**2 should be -9 and the two expressions above are mathematically equivalent.  I originally reported this as a bug (SR-552) as to me the point of operator overloading is to allow you to write numerical expressions cleanly but should give you the correct mathematical result.  The only really useful application I can think of for operator overloading is basically as a DSL for numerical expressions.  If it doesn&#39;t allow you to get correct results without having to put brackets everywhere it sort of defeats the purpose (just my opinion of course).<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; Best regards,<br>
&gt;&gt;&gt; &gt; Jason<br>
&gt;&gt;&gt; &gt; _______________________________________________<br>
&gt;&gt;&gt; &gt; swift-evolution mailing list<br>
&gt;&gt;&gt; &gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt;&gt; &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; swift-evolution mailing list<br>
&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br>
</div></div></blockquote></div><br></div>