えぐち@エスアンドイー です。

>>> In message [ruby-math:00079] Re: NaN again & + -0  
    On Wed, 19 Jan 2000 11:10:17 +0900, "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> said:

小林> 小林です。
小林> 
小林> ----- Original Message ----- 
小林> 送信者 : EGUCHI Osamu <eguchi / shizuokanet.ne.jp>
小林> 件名 : [ruby-math:00077] Re: NaN again & + -0 
小林> > 
小林> >   double mz = -0.0;
小林> > 
小林> > じゃまずいですか?
小林> > #C で -0.0 を生成するって意味ですよね ^^;;
小林> >
小林> って意味です。これは、見事にだめでした(VC)。

これは、ビットパターン的にも +0.0 って事ですね。

  double pz = 0.0;
  double mz = -pz;

ではダメでしょうか?

小林> で、結論は以下のような感じでOKでした。
小林>  double zero() {return 0.0;}
小林>  double one() {return 1.0;}
小林>  double mone() {return -1.0;}
小林>  double minf() {return mone()/zero();}
小林>  double mzero(){return one()/minf();}
小林> 最初表示がうまくいかないので、これでもだめか
小林> と勘違いしていました。整数配列に変換してから
小林> 中身を見たら、ちゃんと再左ビットが立っていました。

その不具合のある表示はどんなコードでしたか?
もし printf() 系であってなら、 ruby の printf とかも
影響を受けそうな気がします。

小林> VCでもOKなので、もちろん他のコンパイラーはOK
小林> でしょうね(^^;;;

前方参照にしないと、インライン展開されそうな気もします
が、今の gcc はプロシージャの順番を変えて前方参照を
強制的に解決するというコード生成を行うので、これ自体も
無効かも知れません。

案外、グローバルな静的変数を使うのが冴えたやり方かも、、

  double zERO = 0.0, oNE = 1.0, mONE = -1.0; 
  double mzero(){ return oNE / (mONE / zERO); }

グローバル変数は、いつ値が変わるとも知れないので、
式の縮退は不可能ですからね。(^^)
#名前の衝突には注意が必要!

	えぐち