Exponentiation order: Difference between revisions

From Rosetta Code
Content added Content deleted
m (clarified languages to programming languages.)
(+ D entry)
Line 21: Line 21:
* Mathworld entry [http://mathworld.wolfram.com/Exponentiation.html exponentiation]
* Mathworld entry [http://mathworld.wolfram.com/Exponentiation.html exponentiation]
<br><br>
<br><br>

=={{header|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>
{{out}}
<pre>5 ^^ 3 ^^ 2 = 1953125
(5 ^^ 3) ^^ 2 = 15625
5 ^^ (3 ^^ 2) = 1953125
[5, 3, 2].reduce!pow = 15625</pre>


=={{header|Perl 6}}==
=={{header|Perl 6}}==

Revision as of 21:48, 19 March 2014

Exponentiation order is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

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

(Most programming languages usually support one of   **,   ^,   or     or somesuch.)

task requirements

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.

See also



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

Perl 6

<lang perl6>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.

While it is possible to define your own postfix operators to do exponentiation, Unicode does not have multilevel subscripts, and postfixes are always evaluated from inside out, so you can't stack them and expect right associativity: <lang perl6>sub postfix:<²>($n) { $n * $n } sub postfix:<³>($n) { $n * $n * $n }

demo '(5³)²'; demo '5³²';</lang>

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

(Not to mention the fact that the form without parentheses looks like you're trying to raise something 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.)

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>

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