# Exponentiation order

Exponentiation order
You are encouraged to solve this task according to the task description, using any language you may know.

This task will demonstrate the order of exponentiation   (xy)   when there are multiple exponents.

(Many programming languages, especially those with extended-precision integer arithmetic, usually support one of `**`, `^`, `↑` or some such for exponentiation.)

Show the result of a language's evaluation of multiple exponentiation (either as an integer or floating point).

If your language's exponentiation operator is not one of the usual ones, please comment on how to recognize it.

Using whatever operator or syntax your language supports (if any), show the results in three lines (with identification):

•   5**3**2
•   (5**3)**2
•   5**(3**2)

If there are other methods (or formats) of multiple exponentiations, show them as well.

## ALGOL 68

Algol 68 provides various alternative symbols for the exponentiation operator generally, "**", "^" and "UP" can be used. <lang algol68>print( ( "5**3**2: ", 5**3**2, newline ) ); print( ( "(5**3)**2: ", (5**3)**2, newline ) ); print( ( "5**(3**2): ", 5**(3**2), newline ) )</lang>

Output:
```5**3**2:        +15625
(5**3)**2:      +15625
5**(3**2):    +1953125
```

## AWK

<lang AWK>

1. syntax: GAWK -f EXPONENTIATION_ORDER.AWK

BEGIN {

```   printf("5^3^2   = %d\n",5^3^2)
printf("(5^3)^2 = %d\n",(5^3)^2)
printf("5^(3^2) = %d\n",5^(3^2))
exit(0)
```

} </lang>

output:

```5^3^2   = 1953125
(5^3)^2 = 15625
5^(3^2) = 1953125
```

## C

C does not have an exponentiation operator. The caret operator '^' performs xor bitwise operation in C. The function pow in the standard C Math library takes 2 arguments.

Expressions in C are evaluated by RPN. The RPNs of 5^3^2 and 5^(3^2) are the same and thus also their pow expressions. <lang C> /*Abhishek Ghosh, 20th March 2014, Rotterdam*/

include<stdio.h>

1. include<math.h>

int main() { printf("\n5 ^ 3 ^ 2 = %.0f",pow(5,pow(3,2))); /*.0f suppresses decimal output*/ printf("\n(5 ^ 3) ^ 2 = %.0f",pow(pow(5,3),2)); printf("\n5 ^ (3 ^ 2) = %.0f",pow(5,pow(3,2)));

return 0; } </lang>

Output:
```
5 ^ 3 ^ 2   = 1953125
(5 ^ 3) ^ 2 = 15625
5 ^ (3 ^ 2) = 1953125
```

## Clojure

Clojure uses prefix notation and expt only takes 2 arguments for exponentiation, so "5**3**2" isn't represented.

<lang clojure>(use 'clojure.math.numeric-tower)

(5**3)**2

(expt (expt 5 3) 2)  ; => 15625

5**(3**2)

(expt 5 (expt 3 2))  ; => 1953125

(5**3)**2 alternative
use reduce

(reduce expt [5 3 2])  ; => 15625

5**(3**2) alternative
evaluating right-to-left with reduce requires a small modification

(defn rreduce [f coll] (reduce #(f %2 %) (reverse coll))) (rreduce expt [5 3 2]) ; => 1953125</lang>

## D

<lang d>void main() {

```   import std.stdio, std.math, std.algorithm;
```
```   writefln("5 ^^ 3 ^^ 2          = %7d", 5 ^^ 3 ^^ 2);
writefln("(5 ^^ 3) ^^ 2        = %7d", (5 ^^ 3) ^^ 2);
writefln("5 ^^ (3 ^^ 2)        = %7d", 5 ^^ (3 ^^ 2));
writefln("[5, 3, 2].reduce!pow = %7d", [5, 3, 2].reduce!pow);
```

}</lang>

Output:
```5 ^^ 3 ^^ 2          = 1953125
(5 ^^ 3) ^^ 2        =   15625
5 ^^ (3 ^^ 2)        = 1953125
[5, 3, 2].reduce!pow =   15625```

## EchoLisp

<lang scheme>

the standard and secure way is to use the (expt a b) function

(expt 5 (expt 3 2))  ;; 5 ** ( 3 ** 2)

```   → 1953125
```

(expt (expt 5 3) 2) ;; (5 ** 3) ** 2

```   → 15625
```
infix EchoLisp may use the ** operator, which right associates

(5 ** 3 ** 2)

```   → 1953125
```

((5 ** 3) ** 2)

```   → 15625
```

(5 ** (3 ** 2))

```   → 1953125
```

</lang>

## Fortran

<lang Fortran>write(*, "(a, i0)") "5**3**2 = ", 5**3**2 write(*, "(a, i0)") "(5**3)**2 = ", (5**3)**2 write(*, "(a, i0)") "5**(3**2) = ", 5**(3**2)</lang>

Output:
```5**3**2   = 1953125
(5**3)**2 = 15625
5**(3**2) = 1953125```

## FreeBASIC

<lang freebasic>' FB 1.05.0

' The exponentation operator in FB is ^ rather than **. ' In the absence of parenthesis this operator is ' left-associative. So the first example ' will have the same value as the second example.

Print "5^3^2 =>"; 5^3^2 Print "(5^3)^2 =>"; (5^3)^2 Print "5^(3^2) =>"; 5^(3^2) Sleep</lang>

Output:
```5^3^2   => 15625
(5^3)^2 => 15625
5^(3^2) => 1953125
```

Haskell has three infix exponentiation operators dealing with different domains:

```λ> :i (^)
(^) :: (Num a, Integral b) => a -> b -> a 	-- Defined in ‘GHC.Real’
infixr 8 ^
λ> :i (**)
class Fractional a => Floating a where
...
(**) :: a -> a -> a
...
-- Defined in ‘GHC.Float’
infixr 8 **
λ> :i (^^)
(^^) :: (Fractional a, Integral b) => a -> b -> a  -- Defined in ‘GHC.Real’
infixr 8 ^^```

All of them are right-associative.

```λ> 5^3^2
1953125
λ> (5^3)^2
15625
λ> 5^(3^2)
1953125
λ> 5**3**2 == 5**(3**2)
True```

However natural chaining of (^^) operator is impossible:

``` 5^^3^^2 = 5^^(3^^2)
```

but (3^^2) is not Integral any longer, so evaluation leads to the type error. Left-assiciative chain is Ok:

```λ> (5^^3)^^2
15625.0
λ> ((5^^3)^^2)^^4
5.9604644775390624e16```

## Io

```Io> 5**3**2
==> 15625
Io> (5**3)**2
==> 15625
Io> 5**(3**2)
==> 1953125
Io> 5 pow(3) pow(2)
==> 15625
Io> 5 **(3) **(2)
==> 15625
Io> Number getSlot("**") == Number getSlot("pow")
==> true
Io> ```

Operators in Io are implemented as methods. Here the `**` method is the same as the `pow` method. Syntax sugar converts "normal" mathematical expressions to messages.

## J

J uses the same evaluation order for exponentiation as it does for assignment. That is to say: the bottom up view is right-to-left and the top-down view is left-to-right.

<lang J> 5^3^2 1.95312e6

```  (5^3)^2
```

15625

```  5^(3^2)
```

1.95312e6</lang>

## Java

Java has no exponentiation operator, but uses the static method java.lang.Math.pow(double a, double b). There are no associativity issues.

## Kotlin

Kotlin does not have a dedicated exponentiation operator and we would normally use Java's Math.pow function instead. However, it's possible to define an infix function which would look like an operator and here we do so for integer base and exponent. For simplicity we disallow negative exponents altogether and consider 0 ** 0 == 1. Associativity would, of course, be the same as for a normal function call. <lang scala>// version 1.0.5-2

infix fun Int.ipow(exp: Int): Int = when {

```   exp < 0   -> throw IllegalArgumentException("negative exponents not allowed")
exp == 0  -> 1
else      -> {
var ans = 1
var base = this
var e = exp
while(e != 0) {
if (e and 1 == 1) ans *= base
e = e shr 1
base *= base
}
ans
}
```

}

fun main(args: Array<String>) {

```   println("5**3**2   = \${5 ipow 3 ipow 2}")
println("(5**3)**2 = \${(5 ipow 3) ipow 2}")
println("5**(3**2) = \${5 ipow (3 ipow 2)}")
```

}</lang>

Output:
```5**3**2   = 15625
(5**3)**2 = 15625
5**(3**2) = 1953125
```

## Lua

<lang Lua>print("5^3^2 = " .. 5^3^2) print("(5^3)^2 = " .. (5^3)^2) print("5^(3^2) = " .. 5^(3^2))</lang>

Output:
```5^3^2 = 1953125
(5^3)^2 = 15625
5^(3^2) = 1953125```

Lua also has math.pow(a, b), which is identical to pow(a, b) in C. Since function arguments are contained in brackets anyway, the associativity of nested uses of math.pow will be obvious.

## Mathematica / Wolfram Language

<lang Mathematica>a = "5^3^2"; Print[a <> " = " <> ToString[ToExpression[a]]] b = "(5^3)^2"; Print[b <> " = " <> ToString[ToExpression[b]]] c = "5^(3^2)"; Print[c <> " = " <> ToString[ToExpression[c]]]</lang>

Output:
```5^3^2 = 1953125
(5^3)^2 = 15625
5^(3^2) = 1953125```

## OCaml/GP

OCaml language has '**' as an exponentiation symbol for floating point integers <OCaml code>

1. 5. ** 3. ** 2. ;;
2. 5. **( 3. ** 2.) ;;
3. (5. ** 3. ) **2. ;;
Output:
```- :   float = 1953125.
- :     float = 1953125.
- :   float = 15625.

```

## PARI/GP

Exponentiation is right-associative in GP. <lang parigp>f(s)=print(s" = "eval(s)); apply(f, ["5^3^2", "(5^3)^2", "5^(3^2)"]);</lang>

Output:
```5^3^2 = 1953125
(5^3)^2 = 15625
5^(3^2) = 1953125```

## Perl

<lang perl>say "\$_ = " . eval(\$_) for qw/5**3**2 (5**3)**2 5**(3**2)/;</lang>

Output:
```5**3**2 = 1953125
(5**3)**2 = 15625
5**(3**2) = 1953125
```

## Perl 6

Works with: rakudo version 2016.08

<lang perl6>use MONKEY-SEE-NO-EVAL; sub demo(\$x) { say " \$x\t───► ", EVAL \$x }

demo '5**3**2'; # show ** is right associative demo '(5**3)**2'; demo '5**(3**2)';

demo '[**] 5,3,2'; # reduction form, show only final result demo '[\**] 5,3,2'; # triangle reduction, show growing results</lang>

Output:
```  5**3**2	───► 1953125
(5**3)**2	───► 15625
5**(3**2)	───► 1953125
[**] 5,3,2	───► 1953125
[\**] 5,3,2	───► 2 9 1953125
```

Note that the reduction forms automatically go right-to-left because the base operator is right-associative. Most other operators are left-associative and would automatically reduce left-to-right instead.

Unicode postfix exponents are supported as well: <lang perl6>demo '(5³)²'; demo '5³²';</lang>

Output:
```  (5³)²	───► 15625
5³²	───► 23283064365386962890625
```

The form without parentheses ends up raising to the 32nd power. Nor are you even allowed to parenthesize it the other way: 5(³²) would be a syntax error. Despite all that, for programs that do a lot of squaring or cubing, the postfix forms can enhance both readability and concision.

## Phix

Phix has a power function rather than an infix power operator, hence there is no possible confusion. <lang Phix>?power(power(5,3),2) ?power(5,power(3,2))</lang>

Output:
```15625
1953125
```

## PicoLisp

The PicoLisp '**' exponentiation function takes 2 arguments <lang PicoLisp>: (** (** 5 3) 2) -> 15625

(** 5 (** 3 2))

-> 1953125</lang>

## Python

<lang python>>>> 5**3**2 1953125 >>> (5**3)**2 15625 >>> 5**(3**2) 1953125 >>> # The following is not normally done >>> try: from functools import reduce # Py3K except: pass

>>> reduce(pow, (5, 3, 2)) 15625 >>> </lang>

## Racket

<lang racket>#lang racket

5**3**2 depends on associativity of **
Racket's (scheme's) prefix function
calling syntax only allows for pairs of arguments for expt.
So no can do for 5**3**2
(5**3)**2

(displayln "prefix") (expt (expt 5 3) 2)

(5**3)**2

(expt 5 (expt 3 2))

There is also a less-used infix operation (for all functions, not just expt)... which I suppose
might do with an airing. But fundamentally nothing changes.

(displayln "\"in\"fix") ((5 . expt . 3) . expt . 2) (5 . expt . (3 . expt . 2))

everyone's doing a reduction, it seems

(displayln "reduction") (require (only-in srfi/1 reduce reduce-right)) (reduce expt 1 '(5 3 2)) (reduce-right expt 1 '(5 3 2))</lang>

Output:
```prefix
15625
1953125
"in"fix
15625
1953125
reduction
14134776518227074636666380005943348126619871175004951664972849610340958208
1953125```

## REXX

<lang rexx>/*REXX program demonstrates various ways of multiple exponentiations. */ /*┌────────────────────────────────────────────────────────────────────┐

``` │ The REXX language uses      **      for exponention.               │
│                   Also,    *  *     can be used.                   │
└────────────────────────────────────────────────────────────────────┘*/
```

say ' 5**3**2 ───► ' 5**3**2 say ' (5**3)**2 ───► ' (5**3)**2 say ' 5**(3**2) ───► ' 5**(3**2)

```                                      /*stick a fork in it, we're done.*/</lang>
```

output

```   5**3**2   ───►  15625
(5**3)**2 ───►  15625
5**(3**2) ───►  1953125
```

## Ruby

<lang ruby>ar = ["5**3**2", "(5**3)**2", "5**(3**2)", "[5,3,2].inject(:**)"] ar.each{|exp| puts "#{exp}:\t#{eval exp}"} </lang>

Output:
```5**3**2:	1953125
(5**3)**2:	15625
5**(3**2):	1953125
[5,3,2].inject(:**):	15625
```

## Sidef

In Sidef, the whitespace between the operands and the operator controls the precedence of the operation. <lang ruby>var a = [

```   '5**3**2',
'(5**3)**2',
'5**(3**2)',
'5 ** 3 ** 2',
'5 ** 3**2',
'5**3 ** 2',
'[5,3,2]«**»',
```

]

a.each {|e|

```   "%-12s == %s\n".printf(e, eval(e))
```

}</lang>

Output:
```5**3**2      == 1953125
(5**3)**2    == 15625
5**(3**2)    == 1953125
5 ** 3 ** 2  == 15625
5 ** 3**2    == 1953125
5**3 ** 2    == 15625
[5,3,2]«**»  == 15625
```

## Tcl

<lang tcl>foreach expression {5**3**2 (5**3)**2 5**(3**2)} {

```   puts "\${expression}:\t[expr \$expression]"
```

}</lang>

Output:
```5**3**2:	1953125
(5**3)**2:	15625
5**(3**2):	1953125
```

There's also a binary `pow()` expression function that always converts its arguments to floating point numbers and then applies the exponentiation operation; it's now largely obsolete because of the `**` operator, but is retained for backward compatibility with older programs.

## VBScript

<lang vb> WScript.StdOut.WriteLine "5^3^2 => " & 5^3^2 WScript.StdOut.WriteLine "(5^3)^2 => " & (5^3)^2 WScript.StdOut.WriteLine "5^(3^2) => " & 5^(3^2) </lang>

Output:
```5^3^2 => 15625
(5^3)^2 => 15625
5^(3^2) => 1953125
```

## zkl

Translation of: C

zkl does not have an exponentiation operator but floats have a pow method. <lang zkl>println("5 ^ 3 ^ 2 = %,d".fmt((5.0).pow((3.0).pow(2)))); println("(5 ^ 3) ^ 2 = %,d".fmt((5.0).pow(3).pow(2))); println("5 ^ (3 ^ 2) = %,d".fmt((5.0).pow((3.0).pow(2))));</lang>

Output:
```5 ^ 3 ^ 2   = 1,953,125
(5 ^ 3) ^ 2 = 15,625
5 ^ (3 ^ 2) = 1,953,125
```

## Go

<lang Go> package main

import "fmt" import "math" func main() {

``` var a,b,c float64
a=math.Pow(5,math.Pow(3,2))
b=math.Pow(math.Pow(5,3),2)
c=math.Pow(5,math.Pow(3,2))
fmt.Printf("5^3^2 = %.0f\n", a)
fmt.Printf("(5^3)^2 = %.0f\n", b)
fmt.Printf("5^(3^2) = %.0f\n", c)
```

} </lang>

Output:
```5^3^2 = 1953125
(5^3)^2= 15625
5^(3^2)= 1953125
```