From: Fumiaki Sakamoto Date: 2014-04-24T17:38:40+09:00 Subject: [ruby-list:49818] Re: 小数点以下の表示で質問があります。 ありがとうございます。 坂元史明 -----Original Message----- From: ruby-list [mailto:ruby-list-bounces@ruby-lang.org] On Behalf Of EGUCHI Osamu Sent: Thursday, April 24, 2014 4:39 PM To: Ruby users (Japanese) Subject: [ruby-list:49817] Re: 小数点以下の表示で質問があります。 2014年4月24日 14:09 Fumiaki Sakamoto : > 昨日はありがとうございました。 > 今日、こちらをアップデートしました。 > おっしゃりたかったのはこのような結果だったでしょうか。 > > http://d.hatena.ne.jp/hateua123/20140424/1398315657 ↑有理数で全て計算するように改善した後ですね 浮動小数の累加の版だと %a で表示している ”n(m) ” の部分が n != m になることがあります。 n はループで求めた値 m は eval("0." + "9" * i) と文字列を評価し Float を作っているので最善の精度だと期待できます。 %a は浮動小数点数の内部表現の16新ダンプでこの表現で一致していれば ビットパターンレベルでも一致してます。 % ruby -ve 'p "%a" % 0.9' ruby 1.9.3p484 (2013-11-22 revision 43786) [amd64-freebsd9] "0x1.ccccccccccccdp-1"  0.9 ⇒ 1.ccccccccccccd * 2 ** -1 0.9 は二進だと循環小数だと判ります。  えぐち >>えぐち@エスアンドイーです >>sprintf の %a フォーマットで浮動小数点数のビットパターンを見てみると、 >>発見があるかもしれません。 >> >> output = sprintf("%18.16f %a(%a)", c, c, eval("0." + "9" * i)) >> >>こんな感じ。 >> >> えぐち >> >>2014年4月23日 16:50 Fumiaki Sakamoto : >>> ありがとうございます。 >>> 早速行ってみます。 >>> >>> On 2014/04/23 16:42, "Tetsuo Sakaguchi" wrote: >>>>In message >>>>2014-04-23T15:17+0900, >>>> Fumiaki Sakamoto wrote: >>>>> Rationalを使っても、0.1という形で10分の1を表現しても私の方法では結果は同じで >>>>> した。 >>>> >>>>a に Rational のインスタンスをいれても他に Float な値があると計算する際に >>>>Float に変換されて、2進の浮動小数点数計算になるので、十進の 0.1 は >>>>2進化される際に近似値になってしまうと思います。その辺りが >>>>きしもとさんの「中途半端に」という指摘なんだと思います。 >>>> >>>>Rational で計算させたいのなら、b とか c に代入している 9.0 とか 0.0 も >>>>Rational か整数にしないと。。。 >>>> >>>>> もともと、0.999...という循環小数が >>>>> 0.999...= 9 x (1/10)**1 + 9 x (1/10)**2 + 9 x (1/10)**3 + ・・・+ 9 x >>>>> (1/10)**n >>>>> で表現され、n=∞の時に1に等しくなるというところを出典に試しに計算させたもので >>>>> す。 >>>>> >>>>> On 2014/04/23 13:33, "KISHIMOTO, Makoto" >>>>>wrote: >>>>> >>>>> >きしもとです >>>>> > >>>>> >> require 'rational' >>>>> >> a = 0.1 あるいは a = Rational(1, 10) >>>>> > >>>>> >この、中途半端に有理数を使って(使おうとして)いるのは何でしょうか? > >