--Multipart_Tue_Jan_18_03:06:51_2000-1
Content-Type: text/plain; charset=ISO-2022-JP

ごとけんです

In message "[ruby-math:00054] NaN again"
    on 00/01/18, "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> writes:

>WindowsNT+VC++6.0(using _isnan())で以下のように
>なりました。
>'?'はちょっと変かなと思うところですがいかがでしょう?

言えば、こういう調査をしてませんでした。

>p a  .0
>p b  .0/0.0 # 1.0/0.0  -1.0/0.0
>#           a  .0 b  nf -Inf NaN (N:NaN T:True F:False 0:ぜろ)

>p a/b    #               0.0  0.0  N

IEEE754的には a/-Inf は -0.0 じゃないとダメですね。

>p b<
  #               1   -1   0?  (should be NaN?)
>p a<  #              -1    1   0?  (should be NaN?)

手元ではちゃんと FloatDomainError になります

>p a   #                F    F   T?
>p b
   #                F    F   T?
>p a! #                T    T   F?
>p b! #                T    T   F?

この4つの NaN との比較は間違っています。

>p a<b    #                T    F   T?
>p b<a    #                F    T   T?
>p a< #                T    F   T?
>p b< #                F    T   T?

IEEE754的にはこれらのNaNとの比較については例外を無効演算例外
を発生しなければならないことになっていて結果は定義されていな
いのでなんともいえません。難しい問題ですが直観的には全部、偽
を返すのが自然に思えます。また、点を考慮して2つの数が比
較不関係にあること調べる演算unorderedの実装が推奨されて
います。

また、libm の関数も必ずしもIEEE754に鬚靴討覆て、たとええ
齣鶯┃握逢 は -0.0 を返さないといけないことになってますが、
少なくともFreeBSDの libm はなってません。

># BigFloat にInfやNaNをいれようとしています(未完)。
># これは、Floatに合わと思います。

合わせるということの意味は上のテストの結果と揃えるという意味
ですか?? なんとなく Inf はではいけないような気がするんで
すが。ただどうあるべきかはよく分かりません。

-- gotoken

# うちの結果と検査用スクリプトつけます

--Multipart_Tue_Jan_18_03:06:51_2000-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="fl000118_1.4.3_1999-12-07_i386-freebsd2.2.6.txt" Content-Transfer-Encoding: 7bit # a # Inf -Inf NaN # 1.0 + a # + - N a + 1.0 # + - N 1.0 - a # - + N a - 1.0 # + - N 1.0 * a # + - N a * 1.0 # + - N 1.0 / a # +0.0 +0.0 N a / 1.0 # + - N 1.0 <a # - + FloatDomainError a <1.0 # + - FloatDomainError 1.0 > a # F T F a > 1.0 # T F F 1.0 > # F T F a > .0 # T F F 1.0 a # F F F a 1.0 # F F F 1.0 ! # T T T a ! .0 # T T T 1.0 < a # T F F a < 1.0 # F T F 1.0 < # T F F a < .0 # F T F
--Multipart_Tue_Jan_18_03:06:51_2000-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="fl000118.rb" Content-Transfer-Encoding: 7bit ME ile::basename($0, ".rb") fn ME, RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM].join("_") + ".txt" $out pen(fn, "w") NaN .0/0.0 Inf .0/0.0 def result(a,line) begin y val(line) rescue y !.type end res ase y when Numeric if y ! "N" elsif 0.0 < y "+" elsif 0 > y "-" else "+%.1f" % y end when FalseClass "F" when TrueClass "T" else y.to_s end res.center(5) end def flocheck(lines) $out.puts "# a #" + " Inf -Inf NaN" $out.puts "#" fmt %10s # %5s %5s %5s" lines.each_line{|line| $out.puts format(fmt, line.chomp.center(8), result(Inf, line), result(-Inf, line), result(NaN, line)) } end op w(+ - * / <> > <lines " op.each{|o| lines << "1.0 #{o} a\n" lines << "a #{o} 1.0\n" } flocheck lines $out.close puts open(fn).read --Multipart_Tue_Jan_18_03:06:51_2000-1--