Ruby Summer of Code近況報告

※この記事は、私の英語版ブログのエントリをベースに和訳しています。

自分のRuby Summer of Codeプロジェクト、 Decimal はうまく行ってる感じです。

中間評価のためにいくつかの目標を設定しましたが、すべてがほぼ終わりました。

ただ注意していただきたいのは、この夏の作業が最新のtarball/gemに反映されていないことです(ごめんなさい…)。最新機能を試される方は、プロジェクトのsubversionレポジトリのtrunkからcheckoutをお願いします。(間もなく行う次のリリースには反映されます)

設定していた目標を順番に挙げてみます。

Webページの作成

まず最初に、シンプルなWebページを作りました。

http://decimal.rubyforge.org/

単純過ぎかもしれません…が、必要な情報は載せたつもりです。少なくとも以前の(殺伐とした)ものよりは、良くなりました :)

以下のような情報が載っています。

  • ダウンロード・インストールの手順
  • 最新のAPIドキュメント (リファレンス)
  • メーリングリスト
  • コード例

数学関数の実装

最近の作業の中では、一番分かりやすい部分だと思います。

計24個の数学関数をDecimal::Math.function()として実装しました。もちろんテストケース付きです。ほとんどの関数はBigDecimalに欠けていたもので、::Math.function()としてFloat用にだけ存在していたものです。

  • acos(x, n)
  • acosh(x, n)
  • asin(x, n)
  • asinh(x, n)
  • atan(x, n)
  • atan2(y, x, n)
  • atanh(x, n)
  • cbrt(x, n)
  • cos(x, n)
  • cosh(x, n)
  • erf(x, n)
  • erfc(x, n)
  • exp(x, n)
  • frexp10(x) (frexpのマネ)
  • hypot(x, y, n)
  • ldexp10(x) (ldexpのマネ)
  • log(x, n)log(x, arbitrary_base, n)
  • log10(x, n)
  • log2(x, n)
  • sin(x, n)
  • sinh(x, n)
  • sqrt(x, n)
  • tan(x, n)
  • tanh(x, n)

上記に加え、pi(n) と e(n) もあります。

xyには、DecimalIntegerが指定できます。またnには(多くの場合、正の)Integerを「スケール」(scale)として指定します。これは「小数点以下n桁」という意味です。

以下がその使用例です。


Decimal::Math functions test


簡単でしょ? ;)

全関数がテストを通っており、ほとんど仕様も固まっているので、それほど大きなつまづきもなく使えると思います。チェックしてみてください! (ドキュメントは間もなく追記予定です。)

ただ残念ながら、gammalgammaという二つの関数だけが未実装です。これが、まだリリースができていない理由です。

最新のRubyへの対応

DecimalはRuby 1.9.1と1.9.2devに対応しました。Ruby 1.9.1でBignumの実装が改良されたので、Decimalを1.9.xと一緒に使えば性能も上がります。 (Decimalは内部的に、BignumのAPI群に依存しています)

もちろんRuby 1.8.xでもDecimalは使えますが、上記の理由から1.9系を推奨します。

またRuby 1.9.xで新しく導入されたC API群を、Decimalは適切に認識し、利用します。

既知のバグの修正

SEGVを起こしたり、誤った値を返したりするような、既知の致命的なバグは直しました。他にもバグや未確定の仕様はありますが、いじってみるためには十分安定していると思います。特にBigDecimalとスピードを比べてみてください。新しいだけあって、だいたい全部速いですよ。

次のリリースは……このあとすぐ!

残りの数学関数が実装・テスト完了次第、現状を「Decimal 0.1.0」としてtarballとgemでリリースする予定です。

もしDecimalの最新情報を手に入れたいという危篤な方は、日本語でおkなdecimal-talk-jaメーリングリストか、ここのフィードを見ていただければ幸いです。(英語ブログの方を優先して更新しますが、随時こちらにもportします。)

というわけで、次のリリースまでチャンネルはそのまま!