[#49804] Re: 小数点以下の表示で質問があります。 — Fumiaki Sakamoto <ght8270407fs@...>

自己レスですみません。

14 messages 2014/04/23
[#49805] Re: 小数点以下の表示で質問があります。 — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp> 2014/04/23

きしもとです

[#49806] Re: 小数点以下の表示で質問があります。 — Fumiaki Sakamoto <ght8270407fs@...> 2014/04/23

きしもとさま

[#49808] Re: 小数点以下の表示で質問があります。 — Tetsuo Sakaguchi <saka@...> 2014/04/23

阪口です。

[ruby-list:49819] Re: 小数点以下の表示で質問があります。

From: dezawa <dezawa@...>
Date: 2014-04-24 12:13:06 UTC
List: ruby-list #49819
出沢です

この話ですが、
 「小数点以下の十進数を二進数で表すと誤差が出る」
と言うこととは違う点で興味を持ちました。

  Float#to_s と "%18.16f"%float では結果が違う!
  それとも、rubyのfloatでは .16fは出しすぎ?

試しに、計算結果としてではなく、数値リテラルで試してみました。
	(1.9.3のirb)
[0.9999990000000001,0.9999999000000001,0.9999999900000001].
 each{|f| puts "%18.16f"%f}
0.9999990000000001
0.9999999000000001
0.9999999900000001
=> [0.9999990000000001, 0.9999999, 0.9999999900000001]

ということで、numeric.cのflo_to_s と spritf の case 'f' を
ざっとみてみたのですが、残念ながら3分ぐらいでは理解できません
でした。

ふと、ruby1.8.7のirbで試してみると
0.9999990000000001
0.9999999000000001
0.9999999900000001
=> [0.999999, 0.9999999, 0.99999999]

to_sの結果が異なります。
diff -u  {ruby-1.8.7-p358,ruby-2.0.0-p353}/numeric.c|less
してみましたら、
ruby1.8.7 では Cの sprintf で変換してますが、2.0.0 では
sprintfは使って居ませんでした。

質問
  ruby2 では sprintf を使わなくなったのは何か理由があるのでしょうか?

蛇足
  53log2 = 15.95
  やはり Float(実態はCのdouble?) では16桁出すのは微妙に多すぎ?
  だから、1.8.7のto_sでは .16g ではなく .15g で変換してるのか?


In This Thread

Prev Next