ごとけんです

In message "[ruby-math:00103] Re: NaN again"
    on 00/01/22, EGUCHI Osamu <eguchi / shizuokanet.ne.jp> writes:

><=> に関する奇妙な挙動として強いて言えば、 Inf <=> Inf があります。 
>Inf - Inf は、NaN ですが Inf == Inf は、真 Inf <=> Inf は 0
>#finite <=> NaN とは様子が違いますが、
>#比較と減算は完全には対応しない実例として、あげられます。

無限大はNaNと違って一意な存在だからなんでしょうね。こーゆー
風変わりな挙動はRuby上でも楽しみたいです ^^;;

>こう言うと、 finite <=> NaN → NaN 論と整合しないようですが、、、
>IEEE754 の例外のディフォルトの挙動は「なにもしない」なので、
>Ruby では何もしないで NaN を返す様ことが妥当だと考えたわけです。

なにもしないがNaNというのはちょっと気になります。まぁNaNを含
む演算は一方のNaNをそのまま(ビットイメージを保ったまま)返す
という例外とは別の原則があるのでそれはそれでよいやも知れませ
ん。

>「全順序でないものに <=> を実装したい場合」の
>『全順序でないもの』って Set (集合) の様な物を想定してますか?

そこまで激しくなくても、NaN的な存在を含むほぼ全順序な構造、
たとえば文字列の配列の配列のクラスAoAの特例として空の配列が
あるような場合を考えていました。たとえば

AoA[["abc"], ["abc", "efc"]] <=> AoA[]

とか。まぁ最小元としてもいいけど、そうしたくない場合もあるで
しょう。

>Set a と Set b に置いて、
>  a が b の部分集合 ⇒ a <=> b → -1
>  b が a の部分集合 ⇒ a <=> b →  1
>  a が b の部分集合でなく、b が a の部分集合でない ⇒ a <=> b → NaN 
>でしょうか?(集合の比較に <=> は無理あり?)

半順序に <=> は良くないでしょうね。

>要するに finite <=> NaN の時(及び NaN <=> finete の時)
>
>   Numeric でない有意な値を返し、例外は発生させない
>
>のであれば、「Numeric でない有意な値」は何でもいいです。 ^^;;;

うう、僕は kind_of? Numeric であるところの NaN を返すという
のがイカすと思っていたのでした ^^;;

意味の無い値という意味では nil に勝るモノはなさそうです。

>mzero() の -0.0 の作り方が凝ってますね。(^^)
>
>ところで、
>
>	double p = +0.0;
>	double n = -0.0;
>	return memcmp(&p, &n, sizeof p) != 0;
>
>程度だとまずいでしょうか?

-0.0 がコンパイラにどう解釈されるかにちょっと疑問を持ったの
で確実な -1.0 を使ってみました。

>ご> # isnan() もこんな感じで実装しちゃった方が確実かも。
>
>NaN を変数に入れて、引数とビット毎の比較と言う事ですね。

>あ、それとも  NaN != NaN ⇒ true がうまく行っていたと思っていたら、
>じつは右辺と左辺は違うビットパタンの NaN だったってケースの問題?

そうそう、そっちの問題です。ぼくは Intel しか知らないのです
が、そういういう変わったことをするやつもあるかと思いまして。

しかしエンディアンの処理は結構頭痛いので isnan() を書くとし
たら、pack.c と同様な技法を使う必要がありそうです。しかし、
Float#to_i や to_s でつかってるからあんまり遅いのもまずいなぁ。
やっぱりこれはボツか。地道に処理系の抜け道を探しましょう :-<

-- gotoken