- ベストアンサー
long doubleの表示方法
long doubleの型を使いたいのですが、出力するとき、 printf("%e\n", A); とすると、8桁しか出力されません。 これを16桁まで出力させる方法はないでしょうか。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
long doubleのときは、eの代わりにLeを使います。 long doubleがサポートされていたとしても、精度はまちまちです。doubleと全く同じ場合もあるでしょうし、80ビットや128ビットであることもあります。 printf("%d, %d\n", sizeof(double), sizeof(long double)); のように確認してみれば、使う意味があるかどうかはわかります。 doubleの精度は15桁なので、微妙なところですね。
その他の回答 (6)
>結局、sizeofの結果はあまり意味がなかったのでしょうか。 sizeofは変数または型が何バイトのメモリを使用するのかがわかるだけです。 なので、sizeof(long double) > sizeof(double)であるならば、long doubleはdoubleよりも精度が高いだろうという事になるのですが、cherry_moonさんが言っているように、実際の精度を意味するわけではありません。 doubleの精度ですが、log10(2^53)は15.95くらいです。個人的には16に満たないものを16と言いたくないので15桁としていますが、どちらでも問題ないと思います。 >printf("%d, %d\n", sizeof(double), sizeof(long double)); >を実行して、終わるときにでてくるようです。 うーむ、なぜこれがエラーになるのかわかりません。 もし、long doubleが必要という事ではなく、16桁表示がしたいだけなのでしたら、doubleを使われるのがトラブルがないかなと思います。
お礼
>sizeofは変数または型が何バイトのメモリを使用するのかがわかるだけです。 >なので、sizeof(long double) > sizeof(double)であるならば、long double >はdoubleよりも精度が高いだろうという事になるのです ありがとうございます。 どうも、色々わからないことがでてきたので、それだけで満足です。(^^;
- cherry_moon
- ベストアンサー率36% (37/102)
勘違いされているところがあるようなので。 >ただ、LINUX付きのCコンパイラでやってみたところ、8,12とでました。 >こっちは、12桁まではOKということなのでしょうね 一般的に計算機では、実数は浮動小数点形式で扱います。 浮動小数点形式では、数値を (仮数部)×(底)^(指数部) の形式に変換します。 底は 2 に固定なので、仮数部と指数部で表現できることになります。 例えば、10 は 2 進数であらわすと、1010 になります。 これを浮動小数点形式であらわすと、 1.01×10(10進数だと2)^11(10進数だと3)になります。 10 は 仮数部 1.01 指数部 11 ということです。 で、sizeof(double) が 8 ということは、 実数を8バイト(=64ビット)で表現するということです。 要するに、64ビットで仮数部と指数部をあらわすということです。 仮数部と指数部がそれぞれ何ビット割り当てるかはシステム次第です。 こちらでは、基本的に仮数部 53ビット、指数部 11ビットのようです。 2進数で53桁の精度があります。 これを10進数に直すと log10(2^53)が約16なので、 精度は16桁ということになります。 ということで、精度とsizeofの結果とは直接関係はありません。
お礼
うむむむ… ややこしい。 結局、sizeofの結果はあまり意味がなかったのでしょうか。
>こっちは、12桁まではOKということなのでしょうね。 ご存知だとは思いますが、この場合の12はcharの12倍の大きさということです。 おそらくCPUはIA32(x86)だと思うのですが、80bitの拡張精度をアラインメントの問題で、10バイトではなく12バイトにしているという事です。 この場合、long double の仮数部は64bitで、精度19桁です。 >エラーでましたが、これはいったい… printf("%.16Le", A) が実行時にエラーを出すって事ですよね? printfが%Lfとか%Leをサポートしていないのなら諦めるしかないかもしれません。
お礼
ご返答ありがとうございます。 エラーは、 printf("%d, %d\n", sizeof(double), sizeof(long double)); を実行して、終わるときにでてくるようです。
- madman
- ベストアンサー率24% (612/2465)
間違いました。16桁表示ですよね。 printf("%.16e\n", A); です。 単に16桁の精度表示(1.1234567890123456e+18)したいだけならlong doubleにする必要はないですよ。
お礼
ご返答ありがとうございました。 なるほど。こんな単純だったのですね。 >単に16桁の精度表示(1.1234567890123456e+18)したいだけならlong doubleに>する必要はないですよ。 そうなのですか。long doubleって一体…
- madman
- ベストアンサー率24% (612/2465)
No.1の方のは記述ミスがあります。 精度を指定するならこのように書いてください。 printf("%.18e\n", A);
- Xxxa
- ベストアンサー率21% (4/19)
long double と言うのが、?状態ですが、普通に精度指定を すれば、大丈夫ではないでしょうか。 printf("%e.18\n", A); と言う風に、、、
お礼
ご返答ありがとうございました。
お礼
ご返答ありがとうございます。 VC++でやってみたところ、両方とも8でした。 ただ、LINUX付きのCコンパイラでやってみたところ、8,12とでました。 こっちは、12桁まではOKということなのでしょうね。 ちなみに実行してみたところ、エラーでましたが、これはいったい…