重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

先ほどC言語のプログラムで
#include <stdio.h>

main()
{
double d_1,d_2,d_3;

d_1=0.1;
d_2=0.001;
d_3=d_1-d_2;

printf("%22.16g-%22.16g=%22.16g\n",d_1,d_2,d_3);

d_1=1.0;
d_2=1.000000000000001;
d_3=d_1-d_2;

printf("%22.16g-%22.16g=%22.16g\n",d_1,d_2,d_3);

d_1=1.0;
d_2=0.00000000000000001;
d_3=d_1-d_2;

printf("%22.16g-%22.16g=%22.16g\n",d_1,d_2,d_3);
}

というのを作ったのですが結果が
0.1 - 0.001 =0.099
1 - 1.000000000000001 =-1.110223024625157e-15
1 - 1e-17=1

でした。この結果はどういう意味なのでしょうか?
初め以外の二つはeが出てきたり、数字の羅列だったりなぜこうなったのか分からないのです?
教えてください。お願いします。

A 回答 (2件)

計算機は小数(浮動小数)も2進数で保持します。

このとき、2を何度掛けていっても
整数にならないものに関しては、誤差を丸めて保持することになります。
0.001くらいであれば誤差が非常に小さいため、計算結果に影響を与えることは
ありません。身近にあるPCに搭載されているCPUではdouble型の仮数部が
52ビットということで、10進にして15.35桁程度しか保持できません。
ということで、16桁以上の計算が出てくる場合は、誤差の影響を受けることに
なります。
1-(1+10^(-15))=-10^(-15)と計算されそうですが(1+10^(-15))は16桁で
表現するため、丸めた誤差が無視できないものとなり、上記の値が出てくることに
なります。
また、1-10^(-17)は18桁であり先ほどの15.35桁では表現できないので、
計算機では1として保持されます。

ちょっと解り難い説明ですが、いかがでしょうか。
    • good
    • 0

浮動小数点数はa×10のb乗という形で値を保持します。


1e-17 と表示されたら、1×10の-17乗と読み替えればいいです。
つまり、

1e-17→0.00000000000000001
-1.110223024625157e-15→0.000000000000001110223024625157

ということです。
%g のかわりに %f を使うと結果が変わる事もあります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!