青山です。

On Wed, 7 Jun 2000 18:05:40 +0900 (JST),
gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro) wrote:

> これらの名前の関数は整数を返すという伝統がありますので違う名
> 前のメソッドを導入した方が良いと考えます。

ああ、なるほど。

> ただその前に、大抵の電卓は内部で10進数として数値を扱っている
> のに対し、Rubyの浮動小数点数は2進ですから、たとえば 0.05 ==
> 1/20 などが2進では循環小数になるため正確な計算が出来ないこと
> がままあると言う事実を考慮しなければなりません。速く、正確に
> 行うためには小林さんの BigFloat のような内部10進のものを使う
> 必要があるでしょう。細かいことを気にしないなら青山さんの定義
> でOKだと思います。なお四捨五入はしばしばお金の計算に使われる
> という事実も考慮しておくべきでしょう。

ええ、標準の Float での話なので、精度については、その程度という前提で
す。で、BigFloat にも、任意の桁数でまるめるメソッドは無いんですね。計
測データの計算などではあると便利そうですが。

まあ、もっとも、BigFloat に関しては、なんらかの演算をして、そのついで
にという手はありますか。と、思いましたが、ちょっと期待した動きと違うよ
うですね。

require "BigFloat"
a = BigFloat::new("0.111")
b = BigFloat::new("0.333")
p a  # [BigFloat:401f66bc,'0.1110E0',4(8)]
p b  # [BigFloat:401f6694,'0.3330E0',4(8)]
p a.div(b,  1)[0]  # [BigFloat:401fe76c,'0.0',4(8)]
p a.div(b,  2)[0]  # [BigFloat:401fe71c,'0.0',4(8)]
p a.div(b,  3)[0]  # [BigFloat:401fe6cc,'0.0',4(8)]
p a.div(b,  4)[0]  # [BigFloat:401fe67c,'0.0',4(8)]
p a.div(b,  5)[0]  # [BigFloat:401fe62c,'0.3333E0',4(12)]
p a.div(b,  6)[0]  # [BigFloat:401fe5dc,'0.3333E0',4(12)]
p a.div(b,  7)[0]  # [BigFloat:401fe58c,'0.3333E0',4(12)]
p a.div(b,  8)[0]  # [BigFloat:401fe53c,'0.3333E0',4(12)]
p a.div(b,  9)[0]  # [BigFloat:401fe4ec,'0.33333333E0',8(16)]
p a.div(b, 10)[0]  # [BigFloat:401fe49c,'0.33333333E0',8(16)]

> ・ div
>    以下のように使用します。
>    c,r = a.div(b,n)
>    c=a/b の計算をします。 r には剰余が代入されます。a/bは必要ならn 桁まで
>    計算されます。divmod メソッドと異なり、c は整数とは限りません。また、 c
>    は丸められることはありません。 a = c*b + r の関係は成立します。

結果を見ると、n の扱いがちょっと違うような。


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>