Semantics of ^^

Don nospam at nospam.com
Tue Dec 8 19:24:26 PST 2009


Bill Baxter wrote:
> On Tue, Dec 8, 2009 at 2:32 AM, Don <nospam at nospam.com> wrote:
>> Based on everyone's comments, this is what I have come up with:
>>
>> --------------------
>> x ^^ y is right associative, and has a precedence intermediate between
>> multiplication and unary operators.
> 
> Is that consistent with math?   I think in math they usually write
> (-1)^n with parens.
> See for example the sin power series here:
> http://en.wikipedia.org/wiki/Power_series

Hmm, that's what's

> 
> What's the rationale for going against math here?
> 
>> * The type of x ^^ y is the same as the type of x * y.
> 
> Like it.
> 
>> * If y == 0,  x ^^ y is 1.
> 
> Need to mention what happens when x is also 0.

No.  0^^0 is 1, as well.

>> * If both x and y are integers, and y > 0,  x^^y is equivalent to
>>   { auto u = x; foreach(i; 1..y) { u *= x; } return u; }
>> * If both x and y are integers, and y < 0, an integer divide error occurs,
>> regardless of the value of x. This error is detected at compile time, if
>> possible.
> 
> Can you explain why you think that's necessary?  Seems like going too
> far towards a nanny compiler for no particularly good reason.
 >
> The fact that 2^^-1 isn't particularly useful doesn't make it
> particularly error prone.  No more so than integer division when the
> person meant floating point division.

Integer division is a well defined operation. 2^^-1 is *never* sensible.

   I just find it unexpected that
> a language would single out exponentiation for this kind of treatment.
> 
>> * If either x or y are floating-point, the result is pow(x, y).
>> --------------------
>> Rationale:
>> (1) Although the following special cases could be defined...
>>  * If x == 1,  x ^^ y is 1
>>  * If x == -1 and y is even, x^^y == 1
>>  * If x == -1 and y is odd, x^^y == -1
>> ... they are not sufficiently useful to justify the major increase in
>> complexity which they introduce.
> 
> Hmm, I'm not so sure about that.  I saw examples of this being used
> even in the small sampling of search results from Python and Fortran
> code that I looked at.  Many mathematical constructs are defined as
> having a leading sign of (-1)^^n  (like the sin series formula linked
> above).

Yes, but n is always positive in those formulae.

> 
>> In all other cases, a negative exponent
>> indicates an error; it should be rewritten as (cast(real)x) ^^ y. Making
>> these cases errors makes everything much simpler, and allows the compiler to
>> use range propagation on the value of y to detect most exponentiation errors
>> at compile time. (If those cases are legal, the compiler can't generate an
>> error on x^^-2, because of the possibility that x might be 1 or -1).
> 
> I didn't see this error as adding much value when there was nothing
> clearly lost from it.  But here you're showing there is a real price
> to pay for this nanny compiler behavior.   To me that makes the error
> clearly not worth the price of admission.  I also think that since 0^0

Rubbish. 0^^0 is 1.

> and 0^-1 and such are mathematically undefined, careful users of opPow
> will already have to put some if() check before blindly doing an x^^y.
>  Instead of
>    if(x!=0 || y!=0)  x^^y;
> the people who care can just change the check to
>    if(x!=0 || y>0) x^^y;
> 
> Doesn't changing that one operator there doesn't seem like an undue
> burden upon those who are careful checkers of their values.
> 
>> Also note that making it an error leaves open the possibility of changing it
>> to a non-error later, without breaking code; but going from non-error to
>> error would be more difficult.
> 
> I think it's pretty clear that the error goes too far right now
> without taking a wait-and-see stance.

Do you realize you are asking for ^^ to be removed? I'm not joking. 
Walter's ready to pull it out. Please reconsider.



More information about the Digitalmars-d mailing list