[discuss tcl variable type of int - how much data fits in that amount, when does tcl use it, when does it benefit the user, etc.]

The expr-function int returns the part of a number that fits in the native C long integer type. For non-integers, this means the decimals are discarded (truncation). For numbers of large absolute value, the most significant bits are discarded, but how many are kept depends on details in how Tcl was compiled. tcl_platform(wordSize) gives the size in bytes of the native long type.

 % set tcl_platform(wordSize)
 % expr int(2.3e7)
 % expr int(2.3e8)
 % expr int(2.3e9)
 % expr int(0x70102030*2)
 % expr 70000*70000
 % expr int(70000*70000)

Note that you can have

 % expr int(1e30)

For "making an integer out of a real number", one should generally use round rather than int, because int(0.999999999) is very different from int(1.00000001). An exception to this rule of thumb is on the output of rand, where

  expr {1 + int(rand()*6)}

is really the way to "roll a dice". This is in part because the value of rand is really an integer that masquerades as a number >0 and <1.

int has two companions for larger integers:

  • wide for 64-bit integers (Tcl8.4+)
  • entier (French pronounciation) for unlimited size integers (Tcl8.5+)

All of these do truncation when applied to doubles. For more controlled conversion to integers there are:

  • round for proper rounding.
  • floor for rounding downwards. Returns a double in type, although the value has zero fractional part.
  • ceil for rounding upwards. Returns a double in type, although the value has zero fractional part.

For going the other way there is:

  • double converts a number to double-precision floating-point form.