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