ページ 1 / 1
変数なんですが・・・
Posted: 2009年1月23日(金) 23:05
by スライク
#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です
と表示されるはずなのですが・・・他は本どおりに表示されたのですがどこが間違っているかわかりません。
アドバイスよろしくお願いします。
Re:変数なんですが・・・
Posted: 2009年1月23日(金) 23:07
by lbfuvab
そちらの環境ではどう表示されたのでしょうか?
Re:変数なんですが・・・
Posted: 2009年1月23日(金) 23:09
by box
1(数字のイチ)とl(英小文字のエル)を取り違えていませんか?
Re:変数なんですが・・・
Posted: 2009年1月23日(金) 23:11
by たかぎ
> 1(数字のイチ)とl(英小文字のエル)を取り違えていませんか?
どっちにしても間違いの可能性が大ですが...
Re:変数なんですが・・・
Posted: 2009年1月23日(金) 23:16
by スライク
>>lbfuvabさん
あっ結果載せてなかったですね。
すみません!
3.141592650000000000000000000
3.14159265358980000000000000000000000
3.1415926535897900000000000000000000000000000000000
こんな感じで表示されました。
Re:変数なんですが・・・
Posted: 2009年1月23日(金) 23:18
by スライク
>> boxさん
>>たかぎさん
指摘ありがとうございます!
1とLを間違ってたみたいです。
Re:変数なんですが・・・
Posted: 2009年1月23日(金) 23:20
by たかぎ
> 1とLを間違ってたみたいです。
%10.8Lf にしたということですか?
だとすると未定義の動作になりますよ。
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 08:06
by non
>printf("%5.2hf\n",flt);
hfってのはどんな指定なんですか?始めてみました。
>他は本どおりに表示されたのですが
参考までに、本の題名を教えて下さい。
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 08:25
by toyo
%lfはしょっちゅう見かけますが%hfは、はじめて見ました
>ストライクさんへ
printfでは%lfも%hfも使わないようにしましょう
float型でもdouble型でも%fで表示します
本に書いてあることにも間違いはあります
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 08:32
by toyo
>nonさんへ
検索してみたところ「猫でもわかる」の本のようです。
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 09:36
by スライク
>>たかぎさん
未定義にはならなくちゃんとコンパイルされたんですけどね・・・・。
おかしいですね。%10.8Lfにしましたよ。
>>nonさん
hf・・・・わかんないです。
何なんでしょうねw初心者にはこの本は難しすぎます!
本はtoyaさんが調べてくれた通り「猫でもわかるC言語プログラミング」です。
>>toyoさん
なるほど・・・。
ありがとうございます!
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 10:00
by box
> 未定義にはならなくちゃんとコンパイルされたんですけどね・・・・。
> おかしいですね。%10.8Lfにしましたよ。
未定義とは、コンパイルできたとしても、
実行時にどういう振る舞いをするかがわからない、という意味です。
%10.8LF
の場合の実行結果はどうなりましたか?
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 10:10
by toyo
%Lfはlong double型の変換子になります。
%Lfでdouble型を表示するのは未定義動作であるという指摘ですね
未定義なのでコンパイラによってはちゃんと表示されることはありますが違うコンパイラを使ったときに不具合が出る可能性があります。
scanf( )でdouble型を入力するのは %lf なので printf( )でも間違って %lfを使う人が多いようです。
あとshort型でもunsigned型でも整数なら %d オンリーだったり。
%hdや%uもありますよといいたいです。
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 11:43
by たかぎ
> 未定義にはならなくちゃんとコンパイルされたんですけどね・・・・。
> おかしいですね。%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
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 17:23
by box
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:変数なんですが・・・
Posted: 2009年1月24日(土) 19:06
by たかぎ
> gccだとこんな風になりました。
codepadもGCCなのですが...
GCCのバージョンが古くないですか? あるいはi386以外のターゲットだとか。
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 19:59
by box
当方のgccは3.4.5です。最新版ではありません。
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 20:15
by たかぎ
> 当方のgccは3.4.5です。最新版ではありません。
MinGW(またはCygwinで-mno-cygwinオプション付加)ではないですか?
MinGWはlong double型に不具合があります。
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 20:21
by box
MinGWです。
その不具合があるということを承知した上で
使っていきます。
Re:変数なんですが・・・
Posted: 2009年1月24日(土) 21:49
by たかぎ
一応補足しておくと...
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型を扱おうとすると不具合に遭遇します。