Scheme:数値リテラル
Schemeの数値リテラルフォーマットは、なんだか複雑だ。
関連: Gauche:数値の入出力, Gauche:拡張浮動小数点演算の謎
#(ナンバー)の存在
Scheme の数値データの書式には # なるものがある。 というか使える実装がある。
STk の例
STk> 123## 12300.0 STk> (/ 123## 123) 100.0
scheme48 の例
> 123## 12355. > (/ 123## 123) 100.447
とまぁこんな次第で、もちろん限定的な数値になる。 r5rs では特に細かな指定が無いわけだから、# => 0 としたり # => 5 としたり、 実際なんでもよくて基数より小さな数値ならなんに置き換えてもよさそうだ。
しかし、実際つかっているのを見たことがないし、 他の言語はあまり広く知らないけど、 こういう数値の書式を指定できるのを聞いたこともなかった。 だいたい実装によって上記の例のように、 同じ式が(限定的とはいえ)結構な誤差を生み出すではないか。
Scheme ではなぜ、こういう入力を許しているのだろう。 そもそも他の言語で当たり前になっていたんなら仕様検討に上がるのも理解できるが、 他の言語であまり見ないのにわざわざ導入されている ってことはこの機能が欲しいという積極的な主張があったと推測されるのだが。
また、r5rs の仕様に盛り込まれているってことは、 色々考えられた末に導入決定されているのだろうが、 そもそも何に、あるいはどういう風に使うのだろう? つまり、これによって我々はどういったパワーを手に入れるのだろう。 ちなみに手元の gosh/cygwin では、 unbound variable になる。
- Shiro: Gauche 0.7.3からはこの形式を(入力のみ)サポートしています。 歴史的経緯については私も良く知らないので、調べてから書きます。 (但し、このフォーマットは少なくともR3RSで見た覚えがあるので、 入ったとしてもずいぶん前のことだと思います。)
R6RS draftに記述を見つけました "It is inexact if it contains a decimal point, an exponent, or a “#” character in the place of a digit; otherwise it is exact." でもやっぱり存在意味不明。
- 「#」は、確定的な数値と限定的な数値の混合演算の結果を、「ここまでは確定的です」という事を 示すために用意されているのではないでしょうか。例として、確定的な数値 1.23456 と限定的な数値 0.001 を足すことを考えると、(exact)0.001 <= (inexact)0.001 < (inexact)0.002 ですから、得られる和xの範囲は 1.23556 <= x < 1.23656 となります。この場合、答えを 1.23### とするということではないかと思います。思いつきですが。(roza)
- Shiro(2007/09/16 05:05:32 PDT): もとはそういう意図だったんだろうなってことは想像 できるんですが、Scheme的潔癖性からすれば「そういう動作が欲しければ interval arithmetic実装すればいいじゃない」って話に行きそうなものです。 (実際、R6RSでもそういう議論になって、結局#記法は落とされました。 かわりに浮動小数点数の仮数部幅を指定できる記法が入ったんですが)