プロが教えるわが家の防犯対策術!

下のプログラムを実行したところ、1/3の計算結果が0.33333333333333331483になってしまいます。これはどこかプログラムが間違っているのでしょうか?

#include<stdio.h>

int main(int argc,char **argv){
double d;

d=1.0/3.0;
printf("%.20f\n",d);
}

A 回答 (4件)

はじめまして



先に回答された方々と重なるところはありますが、
1.コンピュータで扱える桁数は有限なので0.333…と延々と続く少数を正確に表すことは出来ない。
2.(1と重なりますが)コンピュータで使われている2進数では10進数の少数を正確に表すことは出来ない。
ことが原因です。

実用上、“倍精度”の15桁の精度を必要するという場面はそうそう無いので小数点以下の多少の違いは気にする必要はありません。科学の分野では15桁の精度で測定することは超々々々々…(“超”をいくつくけていいのか想像も付きません)の精密測定になります。日本の1年分の予算を1円単位まで正確に把握するには厳しいですが。
    • good
    • 0

まずは、有限桁数の十進数(小数含む)では、10の累乗(マイナス乗含む)の和で表せる数しか正確に表せないのはわかるでしょう。


例としては、108.25は、10の2乗、10のゼロ乗、10のマイナス1乗、10のマイナス2乗をそれぞれ、1,8,2,5個足した物になります。
また1/3は十進小数有限桁で表現できません。

同じように有限桁の二進数では、2の累乗の和で表せる数しか正確に表せません。
1.25=(2^0)+(2^-2)
おなじように1/3は二進小数有限桁で表現できません。
三進数なら1/3を正確に表現できるのですが。

コンピュータ内部では通常は二進数有限桁で数を表現します(一部では十進数有限桁で表すケースも)。
doubleだと、64桁の二進数ですがそのうち有効桁数を表す仮数部という部分は53桁で、これは十進数で言うと約16桁に当たります。
(log2/log10)*53=15.95…

あと初心者が勘違いしやすい点を挙げると、
0.1 も二進小数有限桁で正確に表現できないので、0.1を十回足しても1にはなりません。
    • good
    • 0

有効数字が10数桁ですから、こんなものでしょう。


倍精度は有にある。
    • good
    • 0

間違っていません。

計算に誤差はつきもの。
    • good
    • 0

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