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に
    math::bignum::fromstr string ?base?
  • bignumから文字列に
    math::bignum::tostr bignum ?base?

計算をする前に文字列をbignum型にします。これらの変換時に基数を指定して任意の基数で(基数から)変換することができます。

#16進数からbignumへ
set a [math::bignum::fromstr fff 16]
#bignumから2進数へ
math::bignum::tostr $a 2

色々な演算

  • 符号とか
    math::bignum::sign bignumbignumがマイナスの値の時1を返す
    math::bignum::abs bignumbignumの絶対値を返す
    math::bignum::cmp a ba==bの時0、a>bの時1、a<bの時-1を返す
    math::bignum::iszero bignumbignumが0の時1を返す
  • 比較演算
    math::bignum::lt a ba<b
    math::bignum::le a ba<=b
    math::bignum::gt a ba>b
    math::bignum::ge a ba>=b
    math::bignum::eq a ba==b
    math::bignum::ne a ba!=b
  • 算術演算
    math::bignum::isodd bignumbignumが奇数の時1を返す
    math::bignum::iseven bignumbignumが偶数の時1を返す
    math::bignum::add a ba+b
    math::bignum::sub a ba-b
    math::bignum::mul a ba*b
    math::bignum::divqr a ba/bとその剰余のリストを返す
    math::bignum::div a ba/b
    math::bignum::rem a brem
    math::bignum::mod n mmod
    math::bignum::pow base expbaseのexp乗
    math::bignum::powm base exp mmを法としたbaseのexp乗
    math::bignum::sqrt bignumbignumの平方根の整数部分だけ返す。
    math::bignum::rand bitsbitsを上限とした乱数を返す
  • ビット演算(まだうまく動かないとこアリ)
    math::bignum::lshift bignum bitsbignumを左シフト
    math::bignum::rshift bignum bitsbignumを右シフト
    math::bignum::setbit bignumVar bitbitをセット(bit位置のビットを1にする)
    math::bignum::clearbit bignumVar bitbitをクリア(bit位置のビットを0にする)
    math::bignum::testbit bignum bitbitが1の時は1を、0の時は-1を、範囲外の時は0を返す
    math::bignum::bits bignumbignumを表現するのに必要なビット数を返す

CategoryTclTk


|New|Edit|Freeze|Diff|Backup|Upload|Copy|Rename|
Last-modified: 2004-10-08 (Fri) 00:00:00 (1413d)
HTML convert time: 0.077 sec.