【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21621

精度を調べるプログラムについて
投稿者---sei(2005/06/24 23:45:28)


doubule型の精度を調べるためのプログラムを書いています。
以下のプログラムだと実行させた時にはきちんと
一つずつ1.0、1.01、1.001‥と1が動いてくれるのですが、printf("%.15f\n", a);
の部分の15を16以降の数字に変えると何故か15の時の1.001が16では
1.00099999…というような数字が表示されてしまいます。
このような計算が出てきてしまうのは何故なのでしょうか?

#include<stdio.h> /* for printf, scanf */

int main(void){
double eps = 1.0; /* 比較するためのdouble型の数 */
int z = 1; /* 有効桁数 */
double a; /* 計算表示 */

while((double)(1.0+eps) > (double)1.0){
eps = eps / 10;
a = (double)(1.0+eps);
printf("%.15f\n", a);
++z;
}
printf("%d桁.\n", z);
return(0);
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:精度を調べるプログラムについて 21624 まきじ 2005/06/25 00:23:16


No.21624

Re:精度を調べるプログラムについて
投稿者---まきじ(2005/06/25 00:23:16)


>15を16以降の数字に変えると何故か15の時の1.001が16では
>1.00099999…というような数字が表示されてしまいます。
>このような計算が出てきてしまうのは何故なのでしょうか?

http://web.sfc.keio.ac.jp/~hattori/ipl1bc/text/06.html の
「6.2 小数の計算」に「double 型は10進数で16桁程度の精度を持っています」
とあります。

#詳しくは解りません。
#浮動小数点の計算には、誤差はつきもの?だと思います(^^;


この投稿にコメントする

削除パスワード

No.21626

Re:精度を調べるプログラムについて
投稿者---sei(2005/06/25 00:34:26)


まきじ様、素早い回答ありがとうございます(^^)
誤差は有効数字の打ち切りによって発生することは分かるのですが、
何故、小数以下の表示を16桁に変えただけで計算が変わるのかがとても
疑問です;
これは基礎的なことなのですが、調べても分からない事が。。
double型というのは何桁までを格納できるのでしょうか?表示の時に
表示数を100にしてみたところ、50行以上に渡って0〜9の数字が出てきてしまいました。
精度は15、6桁程度と本では書いてありますが、そうすると表示がおかしいかな・・と;
もしかしたら、プログラム自体が間違えて組んでいるのかもしれませんが(><;)



この投稿にコメントする

削除パスワード

No.21631

Re:精度を調べるプログラムについて
投稿者---まきじ(2005/06/25 01:54:39)


>誤差は有効数字の打ち切りによって発生することは分かるのですが、
>何故、小数以下の表示を16桁に変えただけで計算が変わるのかがとても
>疑問です;

MSDN の「型に対する精度指定の効果」に「値は適切な桁数まで丸められます。」と記述されいます。
丸め誤差が原因ではないでしょうか?
「切捨て」じゃなく「丸める」だから、桁数によって変わるんではないでしょうか?

#先ほどのURLは、違う言語でした(^^;


この投稿にコメントする

削除パスワード

No.21632

Re:精度を調べるプログラムについて
投稿者---カンナ(2005/06/25 02:06:55)


これはVC++6.0 Debug版での話です(今手元にあるのがこれなので)。

表示に指定した精度によって「計算」=「内部表現の10進文字列への変換」は変わっていません。
内部的には精度に関わらず17桁まで計算し、精度の末桁の次を四捨五入しています。
この17桁はdoubleが表現可能な情報量を越えていますから精確ではありません。
doubleが表現可能な情報量の範囲でのみ四捨五入によって精確な値になります。
しかし精度に16以上を指定すると、本来四捨五入されるべき桁が表示に使用されることになります。

なお17桁を越えるときには足りない分を単純に0埋めして切り捨てています。

ところでdoubleの仮数部の情報量が 
 10進15桁 < 52bit=2進52桁 < 10進16桁
なのは理解されていますよね。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧