TIP 123: Adding an Exponentiation Operator to the [expr] Command

Bounty program for improvements to Tcl and certain Tcl packages.
Tcl 2017 Conference, Houston/TX, US, Oct 16-20
Send your abstracts to tclconference@googlegroups.com
by Aug 21.
Author:         Arjen Markus <arjen.markus@wldelft.nl>
Author:         Donal K. Fellows <donal.k.fellows@man.ac.uk>
State:          Final
Type:           Project
Vote:           Done
Created:        16-Dec-2002
Keywords:       mathematics,evaluation
Tcl-Version:    8.5


This TIP proposes to add a new operator to the operators recognised by the [expr] command: the exponentiation operator. This operator will enhance the functionality of the current pow() function by returning a result that depends on the type of its operands. It will also make complicated formulae more readable.


Currently Tcl's [expr] command uses the exponentiation function pow() to calculate such expressions as "2 to the power 10". The drawback of this is twofold:

Other languages, like for instance FORTRAN, use an operator instead of a function. Two operators are commonly found: ** and ^. As the latter already has a meaning within the [expr] command, we propose to add the "**" operator instead. The above example would become:

 2.0*$x**3 - 1.2*$x**2 + 3.0*$x + 4.0

Mathematical Details

The implementation of the exponentiation operator will have the following properties (below we refer to the expression $x**$y):

If x and y are both integers (ordinary or wide):

If either x or y is a double, the C function pow() is used to compute the result.

The following expressions are parsed and evaluated in accordance with all other operators:

 $x ** $y ** $z ==> ($x ** $y ) ** $z
 $x ** -1       ==> ($x ** (-1))

The precedence of the exponentiation operator is thus higher than the multiplication, division and remainder operations and lower than the unary operations, in accordance with common definitions.

Sample Implementation



This document is placed in the public domain.