[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:78162] Re: optimization and accuracy with gcc


  土村@京都と申します。

From: Ken Ebisawa <ebisawa _at_ subaru.gsfc.nasa.gov>
Subject: [linux-users:78154] optimization and accuracy with gcc
Date: Wed, 3 Jan 2001 05:06:51 +0900
Message-ID: <200101022006.PAA27129 _at_ subaru.gsfc.nasa.gov>

> 海老沢@グリーンベルトです。
> ...
> 小数約16桁より下のほうで1.0からずれていて、これはおそらく
> doubleで保障している精度以下なので、1.0と同一視してくれれば
> いいのですが。そういうgccのオプションを探したのですが、ちょっと
> 見つかりませんでした。

  ただ単に、誤差が積み重なるということなら、
適当なところで四捨五入すればよさそうに思います。

#define SHIFT_VALUE   ( 1.0 * (1L<<20) * (1L<<20) )
#define round1(x)   (floor((x) * SHIFT_VALUE + 0.5) / SHIFT_VALUE)

掛け算・割り算で誤差が出ないよう、
2の累乗でやるのがポイントです。
1L<<20 の 20 は適当に調節して下さい。
こうしておいて、

       norm = round1(norm);

を acos() 直前にでも書いておけば大丈夫でしょう。
1.0 付近ではない四捨五入が必要なら、

double round(double x)  {
    int n;
    return ldexp( round1( frexp(x, &n) ), n );
}

などという関数でなんとかなると思います。


  あるいは、gcc(intel?) なら long double という型が使えます。
これなら、もう少し精度を稼げますが、
やはり誤差はなくならないので、四捨五入の処理も必要でしょう。
-----
土村 展之    Nobuyuki Tsuchimura
           tutimura _at_ nn.iij4u.or.jp
    http://www.nn.iij4u.or.jp/~tutimura/

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
References: