From: Yukihiro Matsumoto Date: 2009-06-18T01:05:56+09:00 Subject: [ruby-dev:38677] Re: Fixnum#fdiv まつもと ゆきひろです In message "Re: [ruby-dev:38676] Re: Fixnum#fdiv" on Wed, 17 Jun 2009 23:37:58 +0900, Tadayoshi Funaba writes: |> |Inf <=> X |> |はどう考えるのか、あまりうまい考えが浮びません。 |> |いい考えがあったら教えてください。 |> |> 無限と有限を比較したら、いつも無限が大きいと見なすものなので |> はないでしょうか。NaNの場合にはnilですね。 | |ですから、coerce 以前の判断が必要なわけですよね。Numeric#infinite? も欲 |いですし。ここでもう coerce は破綻していると考えていいですかね。 coerceのことを懸念していらっしゃったわけなんですか。すみませ ん、私はここでは考えていませんでした。[ruby-dev:38671]で 「未知のクラス」とおっしゃってるんだから、当然考えておくべき でしたね。 ちょっと考えてみたのですが、 * 未知のクラスの場合には x <=> Float(y) とする * 未知のクラスの場合には coerce を使う のいずれでも、有限だがFloat()をかけるとInfになるような数が存 在した場合に困ってしまうということですね。なるほど。 で、この対処として * Numeric#infinite?を用意し、coerceを呼ぶ前に無限かどうか を判別する * 気にしない。未知のクラスの十分に大きな数は無限とみなして しまう のいずれかが考えられますね。他にも対処法はあるかも。私なら後 者を選んでしまいそうですが、違う考えの人も居るでしょうね。 しかし、FloatのInfが混じった計算を行った時点で不正確なのです から、どんな結果が出ても「困る」のは限定的な気がします。いっ そのこと、Float#<=>はselfがInfの時、右辺がInfまたはNaNでなけ れば常に大小関係は固定、でも良いのかも(Infの符号だけで決まる)。 まつもと ゆきひろ /:|)