Gauche > Archives > 2019/10/23

2019/10/23 08:43:42 UTChamayama
#
本件ですが、以下に関連情報があります。
https://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3ABugs#H-4gktyh

現状、1e-3 未満 (あるいは 1e9 以上) の数は、指数表記になります。
これは、小さな (あるいは大きな) 浮動小数点数を、
固定小数点で表示することに意味があるのかというところにつながってきます。
(小数点の位置が動くので、固定小数点だと精度がなくなるケースが出ます)
#
深く考えずにひたすら文字列操作で変換するモジュールを、前に作ったことがあります。
https://github.com/Hamayama/eenum/blob/master/eenum.scm
ただ、遅いです。。。
2019/10/23 12:06:34 UTCとおる。
#
なるほど、ありがとうございます。format って普段使わないので、printf のフォーマットと同じように考えていいかわかってませんでした。
2019/10/23 12:48:36 UTCskimu
#
~f では指数表示にならない方がうれしいです。
2019/10/23 13:35:30 UTChamayama
#
double の有効桁数は 15 桁程度なので、
それ以上を指定されたときに、各桁に何を表示するのかを考える必要があります。

(format #f "~f" 1.23e300)
(format #f "~f" 1.23e-300)

Common Lisp ではできているそうなので、やり方はあるのでしょうが。。。
コーナーケースをよく考えないと、
下の方の桁にランダムな数字が表れたりする可能性があります。
2019/10/23 14:28:55 UTCkaki
#
正確な有理数を固定小数点の10進表示にしたいときにも ~f が使えると嬉しいと思います。
2019/10/23 14:39:43 UTChamayama
#
現状、~f で小数の桁数を指定すると、有効桁数を超えた領域を 0 で埋めて表示するようですね。

gosh> (format #f "~,300f" 1.233333333333333333333333333333e300)
"1.23333333333333340000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000e300"
2019/10/23 14:52:27 UTChamayama
#
一度指数表記の文字列を得てから、小数点をずらしたり 0 を追加したりすれば、それらしくなりそうですが、C で書くのはつらそう。。。
2019/10/23 17:52:17 UTChamayama
#
src/number.c の print_double で、指数表記の判定をしている部分をつぶしたら、固定小数点のみで表示されました。 難しく考えすぎでした。
#
ただ、double の有効桁数を超えた領域はすべて 0 になります。
これは、整数や有理数を指定したときも同様です。

gosh> (format #f "~,300f" 1/7)
"0.14285714285714285000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000"
2019/10/23 18:24:06 UTCshiro
#
最終的に~fはCommon Lispに合わせようと思ってます。つまり指数表示なし。~eが常に指数表示で、~gが切り替えるやつです。ただ~eと~gが面倒くさくて、でも指数表示が無いと不便なんで、今の~f~ga
#
~fが指数の範囲固定で切り替わるようになってます。~e, ~gが入ったら~fは指数表示しないようにします。
#
doubleの有効数字を越えた部分については、#で表示する、という仕様が昔のRnRSにはあったんですが、R6RSからかな、廃止されました。あんまり使いどころが無かったんですね。
#
>kaki 正確な有理数を…っていうのはflonumを介さないで(一旦flonumにすると53bitで切られちゃうので)、割り算使ってできるだけ正確に表示するってことでしょうか? それおもしろいですね。ただ、桁数指定せずに ~f 使ったら長大な小数が表示されちゃうってのはちょっとびっくりするので、何か明示的な指定が欲しいところです。
2019/10/23 19:14:45 UTCとおる。
#
なるほどー。個人的には挙動が理解できたので、いまのままでも大丈夫です。