From: Shigeo Kobayashi Date: 2002-04-13T00:35:06+09:00 Subject: [ruby-dev:16888] Re: if Re: BigFloat 小林です。 ----- Original Message ----- From: "Shin-ichiro HARA" Subject: [ruby-dev:16879] Re: if Re: BigFloat > どうも Float には誤差があり、BigDecimal ないかのようなイメージ > あるなら、それは正確じゃないんじゃないですかね。 「誤差がある or ない」という表現にちょっと曖昧さを感 じますが、多分そのようなイメージはないと思います。 > 正確には、Float は単に「量」(内部表現と言ってもいいですが) > と、量の「表現」(具体的には文字列表現)とのインターフェース > が不十分なだけではないですか? そう思います。 ただ、自分がキーインした数字の表現と内部表現の差 は「誤差」かもしれません。 > C 言語による Float の内部表現へのアクセス方法は私は知らない > んですが(誰か助けてください)、例えば Ruby を使って取り出せ > ますね(ここではおおざっぱに桁を多めに取っています): 前に「一般的ではありません」ではなく「一般的ではないと思 います」とちょっと予防線をはってしまったのは、想定していた 方法にこのプログラムもあったからです。 要するに  世のCPUで扱うfloat(Rubyは扱いませんが)やdouble は2のベキ乗を掛けることで必ずビットパターンを取り  出せるのか? 詳しい人がいれば教えてもらえるとうれしいです。 > だから Float だって厳密に有理数に変換できるはずです。多分。 もちろん、方法はCPUや実装言語に依存するかもしれませ んが「厳密に有理数に変換できる」「はず」です。 > 最後に 0 が並んでいますが、これは内部表現の("0.8" の、ではない) > 厳密な文字列表示ですよね。 そう思います。一般的に通用するかどうかは、前記の通り自信 がありません。仮に通用したとしても、残り50%のリテラル変換 誤差と切り離して話すことにちょっと抵抗があります。 ここら辺は、もう十分かと思いますが... > > 実際 C99 では、float 定数の 16 進表記や、strtof によって、16 進 > 表記された文字列から float への厳密な変換ができるみたいです。 「float 定数の 16 進表記」ってのはちょっと...^^;; 今は逆の話ですよね。 > 一方、分母が、BigDecimal は 2 と 5、Float 2 以外の因数を持つ有理 > 数は表現できません。これは文字列表現の問題ではなく、内部実装に応 > じた、重大な量の問題です。この点で両者は同じようなものなわけです。 同意、というか自明ですね。だから Ratinal -> BigDecimal への 自動変換は避けたいと私は思ってるんですが、 (これも、十分ですね...) > ですから、量ではなく量の表現の問題だけならば、表現できないままが > まんするか、表現できるようなメソッドを書けばいいだけの話なので、 ということだったんですね(労力はさておき)。 > それが BigDecimal op Rational が何になるかという、本質的な数シス > テムの話とは結びつかないのではないか、というのが私の説です。 了解しました。 > あれ、石塚案は、BigDecimal op Rational -> BigDecimal は > 確定で、Rational, BigDecimal が最初から相手を必要として > しまうのを避ける工夫の事じゃないかしら。 あっ、そうでした! すいません。 「最初から相手を必要としてしまうのを避ける」ために BigDecimal op Rational -> BigDecimal を実装するの は bigdecimal.c ではなくて bigdecimal-rational.rb 上 でなら、異論はありません。「本質的な数システムの 話」はさておき、必要ならば、それこそメソッドを書け ば良いだけの話ですので。 もちろん bigdecimal.c に実装しても、同様に bigdecimal-rational.rbで置き換えれば良いわけですが、 できれば、一旦作成すると変更しにくい(だけが理由で はありませんが)Cに実装するのは避けたいです。 ------------------ 小林 茂雄 shigeo@tinyforest.jp