C言語関係掲示板

過去ログ

No.499.情報落ちについて

[戻る] [ホームページ]
No.3711

情報落ちについて
投稿者---rolo(2002/12/04 22:25:34)


いつもお世話になっています。「情報落ち」という現象について
質問させて下さい。
参考書等を読んでいると、「情報落ち」とは
-------
情報落ちは絶対値の非常に大きな数値と小さな数値の加減算を行ったとき小さい
数値が演算結果に反映されないために生じる誤差です。
-------
とあり、その理由としては、
-------
足し算や引き算などをするときには、指数部をそろえるため、絶対値が非常
に大きな数と小さな数との足し算や引き算では、小さい数が計算結果に反映
されないことがある
-------
とあります。これは以下のような状態を示しているものと思われますが、

0.12345678×10^5<大きな値
0.87654321×10^-5<小さな値
--------------------------------------
  ↓
   けたを揃える
  ↓
0.12345678×10^5
0.000000000087654321×10^5
---------------------------------------
0.12345678×10^5(小さい方の値が無視されてる)
これを確認するため、次のようなソースを書いたところ、有効桁数でのカット
はあったものの、「無視されている」ということはないように思います。
情報落ちとはどのような局面で実際には発生するのでしょうか?
なお、コンパイラはbcc5.5を使っています。
#include<stdio.h>
main( )
{
	double  a=0.12345678e+5;
	double  b=0.87654321e-5;
	double  c;
	c=a+b;
	printf("%16.15f\n",a);
	printf("%16.15f\n",b);
	printf("%16.15f\n",c);
}



実行結果>---------
12345.678000000000000
0.000008765432100
12345.678008765432320

No.3713

Re:情報落ちについて
投稿者---ともじ(2002/12/04 23:17:49)


こんばんは。

情報落ちの内容については、ご説明の通りで間違いないと思います。
ご提示のプログラムですが、double型で変数を定義していますね。
double型の場合は有効桁数がおよそ16桁ありますので、
この例ですと、小さな数が無視されることはありません。
プログラムの変数をfloat型で定義してみてください。
floatの有効桁数はおよそ7桁ですので、0.87654321e-5の方は
無視されてしまいます。


No.3732

Re:情報落ちについて
投稿者---rolo(2002/12/06 00:00:49)


ともじ様、ご回答ありがとうございます。もう少し質問させて下さい。
double→floatとした以下のプログラムの出力結果は以下のようになりました。
#include<stdio.h>
main( )
{
	float  a=0.123456e+5;
	float  b=0.654321e-5;
	float  c;
	float  d;
	c=a+b;
	d=a-b;
	
	printf("%f\n",a);
	printf("%f\n",b);
	printf("%f\n",c);
	printf("%f\n",d);
}


実行結果>-------------------------
12345.599609<aの値
0.00(←7桁目)0007<bの値
12345.599609<a+bの値
12345.599609<a-bの値

ところが同じプログラムで
a=0.123456e+5→a=0.123456e+3
b=0.654321e-5→b=0.654321e-3
としたところ、以下のように小さい方の値が反映されました。
実行結果>-------------------------
123.456001<aの値
0.0006(←7桁目)54<bの値

123.456657<a+bの値
123.455345<a-bの値

つまり、float型での精度内に答えが収まるときは無視されない
         ↓
「情報落ち」とは「答えの精度内に小さい方の値が入らない場合は小さい方の値が無視される」
現象と理解してよろしいでしょうか?

No.3753

Re:情報落ちについて
投稿者---ともじ(2002/12/07 21:17:49)


こんばんは。
いろいろと試されたのですね。

> 「情報落ち」とは「答えの精度内に小さい方の値が入らない場合は小さい方の値が無視される」
> 現象と理解してよろしいでしょうか?

いえ、あくまでも情報落ちとは最初にroloさんが言っていた、
「情報落ちは絶対値の非常に大きな数値と小さな数値の加減算を行ったとき小さい
数値が演算結果に反映されないために生じる誤差です。」になります。

処理系によっては、floatを内部的にdoubleで扱うものもあるため、上記のような
結果になったものと思われます。

#include<stdio.h>
int main(void)
{
        double a=0.1111111111111111e+5;
        double b=0.1111111111111111e-5;
        double c;

        c = a + b;

        printf("  a:%30.20f\n",a);
        printf("+ b:%30.20f\n",b);
        printf("----------------------------------\n");
        printf("  c:%30.20f\n",c);

        return 0;
}

実行結果(LSIC86試食版で確認)
  a:    11111.11111111110000000000
+ b:        0.00000111111111111111
----------------------------------
  c:    11111.11111222220000000000


No.3755

Re:情報落ちについて
投稿者---rolo(2002/12/07 22:25:34)


わざわざソースまで書いていただいて本当にありがとうございました。