C言語関係掲示板

過去ログ

No.231.floatとdouble の違い


No.1416

floatとdouble
投稿者---つきか(2002/04/16 09:27:03)


はじめての投稿です!
(現在某会社で、新人研修の講師をしています。)
以下のようなプログラムを作って実行したところ
出力結果が「654.320984」となりました。

-------------------------------------------------------
#include<stdio.h>
main()
{
  float  a = 654.321;

  printf("%f",a);
}

-------------------------------------------------------

floatを使って宣言しているとことを
doubleに変更して実行したところ
「654.321000」
と、きちんと表示されました。

なぜなのでしょう?
教えてください q(>_<)p

No.1417

Re:floatとdouble
投稿者---かずま(2002/04/16 11:18:16)


654.321 を浮動小数点で表現すると、
1.0100011100101001000101101000011100101011000000100001... x 2の9乗
二進表現では無限小数になりますから、どこかで打ち切らなければなりません。
double だと小数点以下 52ビット、float だと小数点以下23ビットとなります。
double: 1.0100011100101001000101101000011100101011000000100001 x 2の9乗
float: 1.01000111001010010001011 x 2の9乗
printf を呼び出すとき、floatの値は double に変換されますが、ゼロを補うだけなので、
1.0100011100101001000101100000000000000000000000000000 x 2の9乗
本当の値より少し小さいですね。

float の精度は二進で24ビット、十進で約7桁。
double の精度は二進で53ビット、十進で約16桁。
だから、それ以上表示させても意味がありません。
float a = 654.321; double b = 654.321; の場合、
printf("%.4f\n", a); printf("%.13f\n", b); とすれば問題ありませんね。
これを、printf("%.20f\n", a); printf("%.20f\n", b); とすると、
double でも少し違った値が表示されることがあります。
ちなみに、%f は %.6f と同じです。


No.1418

Re:floatとdouble
投稿者---つきか(2002/04/16 15:26:33)


とてもよく分かりました!!
新人研修の講師などをしていると、ちょっとしたイタイ質問をされて、
困ってしまっていたのですが、これで解決です!
(これを、どうやって、分かりやすく説明するかが問題ですが・・・)
ありがとうございました!!

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.22
Copyright(c) 2000-2002 TOMOJI All Rights Reserved