Path: coconuts.jaist!wnoc-tyo-news!news.u-tokyo.ac.jp!news.u-tokyo.ac.jp!makino From: makino@esanova.c.u-tokyo.ac.jp (Jun Makino) Newsgroups: fj.lang.c Subject: Re: Binary Floating Point Considered Harmful (was: Help!) Date: 15 Oct 1994 10:26:00 GMT Organization: College of Arts and Sciences, Univ. of Tokyo Lines: 44 Distribution: fj Message-ID: References: NNTP-Posting-Host: esanova.c.u-tokyo.ac.jp In-reply-to: yamasaki@phys.uec.ac.jp's message of 14 Oct 1994 12:53:01 GMT In article yamasaki@phys.uec.ac.jp (Ken-ichi Yamasaki) writes: > >>>>> On Fri, 14 Oct 1994 08:56:10 GMT, chik@icot.or.jp (Takashi Chikayama) said: > > もし増分が 0.1 ではなく 0.10003141592653589793238462643383279 だったら, > > 丸め誤差が出ること, それが累積することにすぐ気づいたのではないでしょう > > か. ちょうど 0.1 という十進のわずかな桁数で正確に表現できるような値だっ > > たことが丸め誤差を忘れさせたのではないかと思います. 逆に増分が, > > 0.00000000023283064365386962890625 だったとしたら倍精度計算では丸め誤 > > 差はないのですが (1/2^32), そうであることには気づかないでしょうね. > > for (i=0; i<180; i+=0.00000000023283064365386962890625) > の様に書いておけば良かったのでしょうか。 > 多くのコンパイラーは0.00000000023283064365386962890625を正確に1/2^32に > 変換できるのでしょうか。 いまどきのまともなコンパイラならたいていするんじゃないですか? コンパイラが何をするかをしらべるのはちょっと面倒だったので、入出力ライ ブラリのテストをしてみました。以下のプログラムを走らせると結構笑えるマ シンもありますが、まあまあまともなのが多かった。 main() { double a, b, c; int i; char BCDstring[255]; a = 1.0; for (i=0;i<400;i++){ a *= 0.5; sprintf(BCDstring, "%100.90f", a); sscanf(BCDstring, "%lf", &b); c = a - b; printf("%d %e %e %e\n",i, a, b, c); } } > 毎度、誤差の話しになると、IEEEではこれこれで、IBMでは... なんて内部表 > 現に立ち入った話しをされる方が多いんですが、「実数には誤差がある」って > ことだけでいいんじゃないでしょうか。 駄目。少なくとも「どれくらい」誤差があるか知らないと困るでしょ。 牧野@東大駒場