Tcllib1.8(?)から付く多倍長実数演算です。今のとこSourceForgeからDLできるTcllib1.7には含まれていません。CVSかActiveTcl8.4.9.1からゲットできます。
package require math::bigfloat #適当に計算 set a [fromstr 0.0000000000000000000000000000000000010] set b [fromstr 0.0000000000000000000000000000000000010] puts [tostr [add $a $b]] 2.e-36 #円周率 puts [tostr [pi 50]] 3.1415926535897932384626433832795028841971693993751
このパッケージは内部でbignumも読んでるので、整数の演算(BigInt)も普通にできます。
#BigIntの計算 set a [fromstr 1234000000000000000] set b [fromstr 1234567890000000000] puts [tostr [mul $a $b]]
あと、なんか知らんけどfromstrで実数を変換する時は最後に0をつけないといけないみたいです。たとえばfromstr 0.1はダメでfromstr 0.10にする。
fromstr string ?base?
tostr bigfloat
todouble bigfloat
isInt bighoge isFloat bighoge
add x y sub x y mul x y div x y mod x y abs x opp x ;#符号の反転 pow x n ;#nはBigIntで無ければならない。(Bigfloatは不可)
iszero x equal x y compare x y ;#x==yの時0、x>yの時1、x<yの時-1。BigIntとBigFloatは比較不可
sqrt x log x exp x cos x sin x tan x cotan x acos x asin x atan x cosh x sinh x tanh x pi n ;#n桁の円周率 rad2deg radians ;#ラジアン->度数 deg2rad degrees ;#度数->ラジアン
round x ceil x floor x
あと、この辺の関数は全部グローバルな空間に定義してるので、コンフリクトしないように注意しないといけないです。マニュアルに一応の解決方法が書いてありますけど、できればbignumと名前空間を一緒にするとか統一してほしかった・・・。