多倍長演算ライブラリ
RubyはBignumがあってIntegerクラスと勝手に変換してくれるのが便利だなと思っていたけど、多倍長演算(arbitrary precision arithmetic)のライブラリというのは結構ゴロゴロと存在していて、使うのも難しくないらしいことを発見した。きっとJavaにもいいライブラリがあるんだろうなぁ。
例えばGNUの「GMP」は、Mac OS Xだと、以下のようにコンパイルして実行できる。MacPortsでインストールできるようだけど、ぼくの環境にはすでに入っていた。何かの依存関係で入っていたらしい。
#include <stdio.h> #include <gmp.h> #define BASE 10 int main(void) { mpz_t a, b, r; char num1[256], num2[256]; printf("numbers to multiply? :"); scanf("%s%s", num1, num2); mpz_init(r); mpz_init_set_str(a, num1, BASE); mpz_init_set_str(b, num2, BASE); // mpz_add(r, a, b); mpz_mul(r, a, b); mpz_out_str (stdout, BASE, r); printf("\n"); mpz_clear(a); mpz_clear(b); mpz_clear(r); return 0; }
% gcc -I/opt/local/include -L/opt/local/lib -lgmp test1.c % ./a.out numbers to multiply? :123456789 11111111111111111111111111111111111111111111 1371742099999999999999999999999999999999999986282579 %
結局のところ、Rubyの価値は、こうしたライブラリのAPIみたいなのを覚えたり、型の変換を意識したりせずに、低い学習コスト、準備コストで色んなことができるってことなのかな。