Exponential operator

Don nospam at nospam.com
Fri Aug 7 06:12:27 PDT 2009


Bill Baxter wrote:
> On Fri, Aug 7, 2009 at 3:50 AM, Lars T.
> Kyllingstad<public at kyllingen.nospamnet> wrote:
>> In the 'proposed syntax change' thread, Don mentioned that an exponentiation
>> operator is sorely missing from D. I couldn't agree more.
>>
>> Daniel Keep has proposed the syntax
>>
>>  a*^b
>>
>> while my suggestion was
>>
>>  a^^b
>>
>> Neither of the natural candidates, a^b and a**b, are an option, as they are,
>> respectively, already taken and ambiguous.
>>
>> "Why do we need this?" you say. "Isn't pow(a,b) good enough?" And yes,
>> pow(a,b) is just as good as mul(a,b) or div(a,b), but we don't use those, do
>> we? Exponentiation is a very common mathematical operation that deserves its
>> own symbol. Besides, bearophile has pointed out several optimisations that
>> the compiler can/must perform on exponential expressions.
>>
>> He also proposed that the overload be called opPower.
>>
>> What do you think?
> 
> I'm all for it.
> But if we can't get that, then it might be nice to have at least
> squaring and cubing template functions in std.math.  Squaring numbers
> is so common it deserves a direct way.  It always annoys me when I
> have to write
>    float x = (some expression);
>    float x2 = x*x;
> When I'd like to be able to just write (some expression)^^2.
> sqr(some expression) would be ok, too.  It's odd that sqrt and cbrt
> exist in the std C math library but not their inverses.

Yes, it's powers of 2 and 3 that are 90% of the use cases.
Squaring is a really common operation (more common than xor). An 
optimising compiler always needs to recognize it.

> I found this list of languages with an exponentiation operator:
> # x ↑ y:  Algol,  Commodore BASIC
> # x ^ y: BASIC, J, Matlab, R, Microsoft Excel, TeX (and its
> derivatives), Haskell (for integer exponents), and most computer
> algebra systems
> # x ** y: Ada, Bash, Fortran, FoxPro, Perl, Python, Ruby, SAS, ABAP,
> Haskell (for floating-point exponents), Turing
> # x * y: APL
> 
> --bb

I personally don't understand why anyone would like ** as an 
exponentiation operator. The only thing in its favour is that that's 
what Fortran did. And Fortran only used it because it had almost no 
characters to choose from.  ↑ is the best (yup, I had a C64).
^ is the next best, but unfortunately C grabbed it for xor. I think ^^ 
is the best available option.

Aside from the fact that x**y is ambiguous (eg, x***y could be x ** (*y) 
or x * (*(*y)) ), I just think ^^ looks better:

assert( 3**3 + 4**3  + 5**3 == 6**3 );

assert( 3^^3 + 4^^3  + 5^^3 == 6^^3 );


Found an old discussion, pragma proposed ^^ and opPower:
http://www.digitalmars.com/d/archives/digitalmars/D/18742.html#N18742
The fact that exactly the same proposal came up again is encouraging -- 
it's moderately intuitive.

For overloading, by analogy to opAdd(), opSub(), opMul(), opDiv() it 
should probably be opPow().




More information about the Digitalmars-d mailing list