変数なんですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
スライク

変数なんですが・・・

#1

投稿記事 by スライク » 16年前

#include<stdio.h>
#include<float.h>
int main(void)
{
double pai=3.14159265358979;
int mon=2;
float flt=1.2f;

printf("%5.2hf\n",flt);
printf("%-5.2f\n",flt);
printf("%05.2f\n",flt);
printf("%+08.2f\n",flt);
printf("%-08.2f\n",flt);

printf("%d\n",mon=3);

printf("%e\n",pai);

printf("%08.2f\n",pai);
printf("%05d\n",mon);

printf("円周率は%fです\n",pai);
printf("円周率は%1fです\n",pai);
printf("もう少し詳しい値は%10.81fです\n",pai);
printf("もう少し詳しい値は%15.131fです\n",pai);
printf("もう少し詳しい値は%20.18fです\n",pai);
printf("円周率は%010.2f\n",pai);
printf("円周率は%-10.2f\n",pai);
printf("円周率は%10.2f\n",pai);
return 0;
}

これなんですがどうしても結果が本通りになりません。
本だと
もう少し詳しい値は3.14159265です
もう少し詳しい値は3.1415926535898です
もう少し詳しい値は3.141592653589790000です
と表示されるはずなのですが・・・他は本どおりに表示されたのですがどこが間違っているかわかりません。

アドバイスよろしくお願いします。

lbfuvab

Re:変数なんですが・・・

#2

投稿記事 by lbfuvab » 16年前

そちらの環境ではどう表示されたのでしょうか?

box

Re:変数なんですが・・・

#3

投稿記事 by box » 16年前

1(数字のイチ)とl(英小文字のエル)を取り違えていませんか?

たかぎ

Re:変数なんですが・・・

#4

投稿記事 by たかぎ » 16年前

> 1(数字のイチ)とl(英小文字のエル)を取り違えていませんか?

どっちにしても間違いの可能性が大ですが...

スライク

Re:変数なんですが・・・

#5

投稿記事 by スライク » 16年前

>>lbfuvabさん
あっ結果載せてなかったですね。
すみません!

3.141592650000000000000000000
3.14159265358980000000000000000000000
3.1415926535897900000000000000000000000000000000000

こんな感じで表示されました。

スライク

Re:変数なんですが・・・

#6

投稿記事 by スライク » 16年前

>> boxさん
>>たかぎさん

指摘ありがとうございます!

1とLを間違ってたみたいです。

たかぎ

Re:変数なんですが・・・

#7

投稿記事 by たかぎ » 16年前

> 1とLを間違ってたみたいです。

%10.8Lf にしたということですか?
だとすると未定義の動作になりますよ。

non

Re:変数なんですが・・・

#8

投稿記事 by non » 16年前

>printf("%5.2hf\n",flt);
hfってのはどんな指定なんですか?始めてみました。


>他は本どおりに表示されたのですが
参考までに、本の題名を教えて下さい。

toyo

Re:変数なんですが・・・

#9

投稿記事 by toyo » 16年前

%lfはしょっちゅう見かけますが%hfは、はじめて見ました

>ストライクさんへ
printfでは%lfも%hfも使わないようにしましょう
float型でもdouble型でも%fで表示します
本に書いてあることにも間違いはあります

toyo

Re:変数なんですが・・・

#10

投稿記事 by toyo » 16年前

>nonさんへ

検索してみたところ「猫でもわかる」の本のようです。

スライク

Re:変数なんですが・・・

#11

投稿記事 by スライク » 16年前

>>たかぎさん
未定義にはならなくちゃんとコンパイルされたんですけどね・・・・。
おかしいですね。%10.8Lfにしましたよ。

>>nonさん
hf・・・・わかんないです。
何なんでしょうねw初心者にはこの本は難しすぎます!
本はtoyaさんが調べてくれた通り「猫でもわかるC言語プログラミング」です。

>>toyoさん
なるほど・・・。
ありがとうございます!

box

Re:変数なんですが・・・

#12

投稿記事 by box » 16年前

> 未定義にはならなくちゃんとコンパイルされたんですけどね・・・・。
> おかしいですね。%10.8Lfにしましたよ。

未定義とは、コンパイルできたとしても、
実行時にどういう振る舞いをするかがわからない、という意味です。
%10.8LF
の場合の実行結果はどうなりましたか?

toyo

Re:変数なんですが・・・

#13

投稿記事 by toyo » 16年前

%Lfはlong double型の変換子になります。
%Lfでdouble型を表示するのは未定義動作であるという指摘ですね
未定義なのでコンパイラによってはちゃんと表示されることはありますが違うコンパイラを使ったときに不具合が出る可能性があります。

scanf( )でdouble型を入力するのは %lf なので printf( )でも間違って %lfを使う人が多いようです。
あとshort型でもunsigned型でも整数なら %d オンリーだったり。
%hdや%uもありますよといいたいです。

たかぎ

Re:変数なんですが・・・

#14

投稿記事 by たかぎ » 16年前

> 未定義にはならなくちゃんとコンパイルされたんですけどね・・・・。
> おかしいですね。%10.8Lfにしましたよ。

http://codepad.org/で試すと、次のような結果になりました。

1.20
1.20
01.20
+0001.20
1.20
3
3.141593e+00
00003.14
00003
円周率は3.141593です
円周率は3.141593です
もう少し詳しい値は-0.00000000です
もう少し詳しい値は-0.0000000000000です
もう少し詳しい値は3.141592653589790007です
円周率は0000003.14
円周率は3.14
円周率は 3.14

box

Re:変数なんですが・・・

#15

投稿記事 by box » 16年前

gccだとこんな風になりました。

 1.20
1.20
01.20
+0001.20
1.20
3
3.141593e+000
00003.14
00003
円周率は3.141593です
円周率は3.141593です
もう少し詳しい値は3.14159265です
もう少し詳しい値は3.1415926535898です
もう少し詳しい値は3.141592653589790000です
円周率は0000003.14
円周率は3.14
円周率は      3.14

たかぎ

Re:変数なんですが・・・

#16

投稿記事 by たかぎ » 16年前

> gccだとこんな風になりました。

codepadもGCCなのですが...
GCCのバージョンが古くないですか? あるいはi386以外のターゲットだとか。

box

Re:変数なんですが・・・

#17

投稿記事 by box » 16年前

当方のgccは3.4.5です。最新版ではありません。

たかぎ

Re:変数なんですが・・・

#18

投稿記事 by たかぎ » 16年前

> 当方のgccは3.4.5です。最新版ではありません。

MinGW(またはCygwinで-mno-cygwinオプション付加)ではないですか?
MinGWはlong double型に不具合があります。

box

Re:変数なんですが・・・

#19

投稿記事 by box » 16年前

MinGWです。
その不具合があるということを承知した上で
使っていきます。

たかぎ

Re:変数なんですが・・・

#20

投稿記事 by たかぎ » 16年前

一応補足しておくと...

MinGWのprintf系関数やscanf系関数は、Visual C++のものを流用しています。
Visual C++では、(16ビット版のバージョン1.xを除き)long double型は64ビットでdouble型と同じ精度です。
それに対して、MinGWのlong double型は80ビット(ただし、sizeof(double)は12バイト)ですので、矛盾があります。
結果として、MinGWのprintf/scanf系関数でlong double型を扱おうとすると不具合に遭遇します。

閉鎖

“C言語何でも質問掲示板” へ戻る