Tclで多倍長演算
高木です。おはようございます。
昨日は、GCC 7.1を使ってTcl/Tkのラッパーライブラリを作る話をしました。
Tcl/Tkというように、大体はTkが主役で、Tkを使うためにしかたなくTclと付き合うような話になりがちです。
そこで今回は、純粋にTclに注目してみたいと思います。
昔のバージョンはともかく、近年のTclはずいぶん高速化されましたし、機能も豊富になっています。
比較的新しい機能として、多倍長演算があります。
普通、コンピュータで扱える数値は、32ビットとか64ビットとか、ある程度制限された精度しか持っていません。
多倍長演算を使うと任意精度が実現できるのです。
64ビット整数の場合、せいぜい(十進法で)20桁ぐらいの精度しかありません。
ところが、多倍長演算を使えば、100桁でも200桁でも扱うことができるのです。
そうした多倍長演算がTclでも使えるようになっています。
ちょっとしたコードを書いてみましょう。
1 2 | set a 1000000000000000000000000000000000000000000000000000000000000000000000000000000001 puts [expr $a * $a * $a * $a] |
このように意地の悪い計算を試したとしても、ちゃんと
1 | 1000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000001 |
という答えを返してくれます(横スクロールしないと表示しきれないぐらいの桁数です)。
CやC++には多倍長演算の機能が標準では備わっていません。
多倍長演算のライブラリはいろいろあるのですが、GNU関連のものはライセンス的に使いにくかったりしますし、Boost C++ Librariesのそれは手軽さに欠けるように思います。
今回、Tcl/Tkのラッパーライブラリを作るわけですから、Tclの多倍長演算を使わない手はありません。
実は、Tclの多倍長演算には、LibTomMathというライブラリが使われています。
このLibTomMathは、Boost C++ Librariesの多倍長演算ライブラリでも、その実装のひとつに使われているものです。
比較的軽量のライブラリで、ちょっと多倍長演算を使いたいときにはもってこいかと思います。
今回は、Tclの多倍長演算について紹介してみました。
ほかにもTclには、マルチプラットフォームで使えるライブラリ機能が豊富にあるので、機会があればまた紹介してみたいと思います。