Tcllib1.7で桁数制限の無いbignumが使えるようになりました。元々はここで公開されていた拡張を取り込んだみたです。
使ってみる
package require math::bignum
set a [math::bignum::fromstr 18446744073709551615]
set b [math::bignum::fromstr 18446744073709551615]
set c [math::bignum::mul $a $b]
puts [math::bignum::tostr $c]
この例はunsigned long型の最大値を掛けています。bignumパッケージでは、最初に文字列からbignumのデータ型に変換する必要があります。
文字列とbignumの相互変換
計算をする前に文字列をbignum型にします。これらの変換時に基数を指定して任意の基数で(基数から)変換することができます。
#16進数からbignumへ
set a [math::bignum::fromstr fff 16]
#bignumから2進数へ
math::bignum::tostr $a 2
色々な演算
- 符号とか
math::bignum::sign bignum | bignumがマイナスの値の時1を返す |
math::bignum::abs bignum | bignumの絶対値を返す |
math::bignum::cmp a b | a==bの時0、a>bの時1、a<bの時-1を返す |
math::bignum::iszero bignum | bignumが0の時1を返す |
- 比較演算
math::bignum::lt a b | a<b |
math::bignum::le a b | a<=b |
math::bignum::gt a b | a>b |
math::bignum::ge a b | a>=b |
math::bignum::eq a b | a==b |
math::bignum::ne a b | a!=b |
- 算術演算
math::bignum::isodd bignum | bignumが奇数の時1を返す |
math::bignum::iseven bignum | bignumが偶数の時1を返す |
math::bignum::add a b | a+b |
math::bignum::sub a b | a-b |
math::bignum::mul a b | a*b |
math::bignum::divqr a b | a/bとその剰余のリストを返す |
math::bignum::div a b | a/b |
math::bignum::rem a b | rem |
math::bignum::mod n m | mod |
math::bignum::pow base exp | baseのexp乗 |
math::bignum::powm base exp m | mを法としたbaseのexp乗 |
math::bignum::sqrt bignum | bignumの平方根の整数部分だけ返す。 |
math::bignum::rand bits | bitsを上限とした乱数を返す |
- ビット演算(まだうまく動かないとこアリ)
math::bignum::lshift bignum bits | bignumを左シフト |
math::bignum::rshift bignum bits | bignumを右シフト |
math::bignum::setbit bignumVar bit | bitをセット(bit位置のビットを1にする) |
math::bignum::clearbit bignumVar bit | bitをクリア(bit位置のビットを0にする) |
math::bignum::testbit bignum bit | bitが1の時は1を、0の時は-1を、範囲外の時は0を返す |
math::bignum::bits bignum | bignumを表現するのに必要なビット数を返す |
CategoryTclTk