From: Tadayoshi Funaba Date: 2008-02-16T09:24:12+09:00 Subject: [ruby-dev:33803] Complex(-0.0, -0.0) & Unify r14020 で、虚部の -0.0 を保存するようになったようですが、mathn して Unify されると -0.0 になってしまい、結果的に情報が失われることになりま す。 $ ruby19 -r complex -e 'c=Complex(-0.0, -0.0); p [c, c.image.class]' [Complex(-0.0, -0.0), Float] $ ruby19 -r mathn -e 'c=Complex(-0.0, -0.0); p [c, c.image.class]' [-0.0, Fixnum] また、-0.0 の虚部があるということは、to_s でも問題になります。 $ ruby19 -r complex -e 'p Complex(-1.0, -0.0).to_s' "-1.0+-0.0i" 要素が浮動小数点数である場合は、Unify しないと一応防げると思います。 Common Lisp では、要素が浮動小数点数であるとき canonicalization がない ので、#c(5.0 0.0) が 5.0 になったりはしませんが、虚部の符号が保存され るかどうかは別問題のようです (仕様書にもある処理系による浮動小数点数自 体のあつかいの違いとして)。 CMU Common Lisp の場合 * #c(-0.0 -0.0) #C(-0.0 -0.0) * (decode-float (imagpart #c(-0.0 -0.0))) 0.0 -126 -1.0 CLISP の場合 [1]> #c(-0.0 -0.0) #C(0.0 0.0) [2]> (decode-float (imagpart #c(-0.0 -0.0))) 0.0 ; 0 ; 1.0 factor は Common Lisp と同じかと思ったら違った。 ( scratchpad ) USE: math.functions ( scratchpad ) C{ 1.0 2.0 } . C{ 1.0 2.0 } ( scratchpad ) C{ -0.0 -0.0 } . -0.0 ( scratchpad ) -0.0 dup rect> . -0.0