土村@京都と申します。 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/
References:
- Prev by Subject: [linux-users:78161] Re: optimization and accuracy with gcc
- Next by Subject: [linux-users:78163] VAIOでRedHat
- Previous by thread: [linux-users:78216] Re: ネットワークの設定・・・。
- Next by thread: [linux-users:78181] Re: optimization and accuracy with gcc
- Indexes:[Main][Thread]