From: masa / stars.gsfc.nasa.gov
Subject: [ruby-math:00467] Re: NArray#==
Date: Mon, 25 Jun 2001 13:26:04 -0400 (EDT)

るびきちです。

> うーむ、そうですか。要素同士の比較結果を配列で返す、という現状の
> 仕様は、私は結構重要なポイントだと思っているので、できれば変えた
> くないと思っています。Octaveでもそういう仕様になってます。
Octave・・なつかしい。
NArrayのおかげで簡単にBLAS/LAPACKの関数をwrapできるようになったので、
すごい嬉しいです。

以前にBLASをwrapすることに挑戦しましたが、
* 引数をどう処理するか
* オブジェクトの構造
* coerceまわりでのオブジェクト間の癒着
などの問題がでてきて悩んでましたが、NArrayを使って
((*とりあえずwrap*))するメソッドを作りました。
おかげで↑のような問題とRuby←→Cインターフェースを分離できたようで嬉しいのです。

たとえば、dscal_ をwrapするのは以下のようにしてます。
dscal_ ( N,  ALPHA, X, INCX )
VALUE _wrap_DSCAL(VALUE self, VALUE x_total, VALUE da, VALUE x_ptr, VALUE incx){
        int _x_total; double _da; struct NARRAY *_x_ptr_na; double* _x_ptr; int _incx;
        GetNArray(x_ptr, _x_ptr_na);
        _x_total = FIX2INT(x_total); _da = NUM2DBL(da); _x_ptr = (double *)_x_ptr_na->ptr; _incx = FIX2INT(incx);
        DSCAL(&_x_total, &_da, _x_ptr, &_incx);
        return Qtrue;
}

> > 今は assert_equal_narray を書いて逃げることにします(泣)
> 
> 浮動小数点数の計算は誤差が入ることがあって、テストが正しくても 
> == でfalseになることがあるので、そういうのも考慮した
> assert_equal_narray を定義するのがよいのではないでしょうか。
> 例えば、a==b==0でないとき (a-b).abs/(a.abs+b.abs) < 1e-15
> を調べるとか。
もちろんそれについては考えないといけませんね。
今やろうとしてたとこです。


るびきち☆
http://voo.to/ruby/ ←Ruby大衆化計画(笑)