3

Feb

Among all the languages I know, Ada is one of the few that offers and exponential operator: **.

In mathematics, you generally write an exponential using a small font and moving the exponent up above the normal line. The notation of x power y is written this way:

x^{y}^{ } (1)

I will assume that most people know that a negative number power an odd number is negative. The same negative number power an even number is positive. So for instance, -1 power 3 is -1 and -1 power 2 is 1:

-1^{3} = -1 and -1^{2} = 1 (2)

In Ada, you write such expression using the ** operator as in:

r := x ** y; (3)

So it would feel reasonable to write the expression:

r := -1 ** 3; (4)

and expect r to be set to -1. And it is.

Similarly, you probably would think that the following will return 1:

r := -1 ** 2; (5)

And that's not the case. The result of this last expression is -1. Why? Because the minus is taken as a negation of a term and not a primary expression. In other words, the expression in (5) is equivalent to this one:

r := -(1 ** 2); (6)

This can be disturbing since writing the expression with variables, the effects feel like they are *different*:

procedure test is (7) x, y, r: integer; begin x := -1; y := 2; r := x ** y; end test;

In this case r is set to 1. This is because when -1 is in variable x the expression becomes similar to this:

r := (-1) ** 2; (8)

If you come from a language such as C/C++, Java, PHP, then you probably will expect (5) to work like (8). This is because in these languages the negate operator (-expr) is viewed as a primary operator.

Reference: RM 2005 Chapter 4.4 § 4

- Alexis Wilke's blog
- Login to post comments