[[fill in information about tcl's handling of integers - particular the new Tcl 8.5 longer integer support]] Starting from Tcl 8.5, the expr command is based on LibTomMath arbitrary precision integers : http://math.libtomcrypt.com/ ---- [MB] Note that in Tcl releases prior to 8.5, integer calculations were performed with one of the C types long int or Tcl_WideInt. Since a "long int" is based on 32 bits, with one bit for the sign, the maximum positive integer is 2^31. The following is a little algorithm which computes the maximum integer which can be processed without truncation. # # searchintmax -- # Compute the maximum integer on Tcl platform. # proc searchintmax {imax {fine 0}} { # # Search the maximum available power of 2 which keeps multiplication # set a 1 for {set i 1} {$i<$imax} {incr i} { set n [expr {$a*2}] set p [expr {$n/2}] puts "a=$a, n=$n, p=$p" if {$p!=$a} then { break } set a $n } # # Refine process with positivity property of addition # if {$fine==1} then { set shift [expr {int(pow(2,30))}] for {set i 1} {$i<$imax} {incr i} { set n [expr {$a+$shift}] puts "a=$a, shift=$shift, n=$n" if {$n<=0} then { set shift [expr {$shift/2}] if {$shift==0} then { break } } set a [expr {$a + $shift}] } } return $a } If one uses this algorithm with Tcl 8.4, one gets the 2^30=1073741824 value, which is the greatest a such (a * 2)/2 = a. set intmax [searchintmax 100] With the fine=1 option, one can get the finer value 2^31=2147483647, which is the greatest a such that (a + 1) - 1 = a. set intmax [searchintmax 100 1] With Tcl 8.5, the loop reaches the maximum number of iterations, which is the expected result. ---- See also [wide]. ---- !!!!!! %|[Category Internals]|% !!!!!!