В математике с плавающей точкой Tcl используются значения с плавающей запятой IEEE; в них только около 15 значимых значащих цифр (в мантиссе фактически 53 бита). Вместо этого вам нужно использовать пакет с арифметикой произвольной точности c. Tcllib имеет один, math::bigfloat
:
package require math::bigfloat
namespace import math::bigfloat::*
# How many digits do we want
set places 1000
set x [fromstr 1.0 $places]
set y [fromstr 9.0 $places]
set z [div $x $y]
puts [tostr $z]
Вы также можете использовать math::exact
от Tcllib, который внутри себя немного по-другому (вы указываете Точность, которую вы хотите получить в выводе в конце ):
package require math::exact
namespace import math::exact::exactexpr
# This package uses *binary* precision, not decimal
set precision [expr {ceil(log(10)/log(2) * 1000)}]
set x [[exactexpr 1] ref]
set y [[exactexpr 9] ref]
set z [[exactexpr {$x / $y}] ref]
$z asFloat $precision
Материал ref
связан с управлением счетчиком ссылок, потому что объекты выражения внутренне нетривиальны.