OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

long doubleの表示方法

  • 困ってます
  • 質問No.145087
  • 閲覧数1855
  • ありがとう数7
  • 気になる数0
  • 回答数7
  • コメント数0

お礼率 74% (166/222)

long doubleの型を使いたいのですが、出力するとき、

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

とすると、8桁しか出力されません。
これを16桁まで出力させる方法はないでしょうか。
通報する
  • 回答数7
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.4

long doubleのときは、eの代わりにLeを使います。

long doubleがサポートされていたとしても、精度はまちまちです。doubleと全く同じ場合もあるでしょうし、80ビットや128ビットであることもあります。
printf("%d, %d\n", sizeof(double), sizeof(long double));
のように確認してみれば、使う意味があるかどうかはわかります。

doubleの精度は15桁なので、微妙なところですね。
お礼コメント
lucky111

お礼率 74% (166/222)

ご返答ありがとうございます。
VC++でやってみたところ、両方とも8でした。
ただ、LINUX付きのCコンパイラでやってみたところ、8,12とでました。
こっちは、12桁まではOKということなのでしょうね。

ちなみに実行してみたところ、エラーでましたが、これはいったい…
投稿日時 - 2001-10-04 09:33:28
-PR-
-PR-

その他の回答 (全6件)

  • 回答No.2
レベル14

ベストアンサー率 24% (612/2465)

No.1の方のは記述ミスがあります。 精度を指定するならこのように書いてください。 printf("%.18e\n", A);
No.1の方のは記述ミスがあります。
精度を指定するならこのように書いてください。
printf("%.18e\n", A);


  • 回答No.1
レベル6

ベストアンサー率 21% (4/19)

long double と言うのが、?状態ですが、普通に精度指定を すれば、大丈夫ではないでしょうか。 printf("%e.18\n", A); と言う風に、、、 ...続きを読む
long double と言うのが、?状態ですが、普通に精度指定を
すれば、大丈夫ではないでしょうか。

printf("%e.18\n", A);

と言う風に、、、
お礼コメント
lucky111

お礼率 74% (166/222)

ご返答ありがとうございました。
投稿日時 - 2001-10-03 23:48:30
  • 回答No.3
レベル14

ベストアンサー率 24% (612/2465)

間違いました。16桁表示ですよね。 printf("%.16e\n", A); です。 単に16桁の精度表示(1.1234567890123456e+18)したいだけならlong doubleにする必要はないですよ。 ...続きを読む
間違いました。16桁表示ですよね。
printf("%.16e\n", A);
です。

単に16桁の精度表示(1.1234567890123456e+18)したいだけならlong doubleにする必要はないですよ。
お礼コメント
lucky111

お礼率 74% (166/222)

ご返答ありがとうございました。
なるほど。こんな単純だったのですね。

>単に16桁の精度表示(1.1234567890123456e+18)したいだけならlong doubleに>する必要はないですよ。

そうなのですか。long doubleって一体…
投稿日時 - 2001-10-03 23:47:46
  • 回答No.5

>こっちは、12桁まではOKということなのでしょうね。 ご存知だとは思いますが、この場合の12はcharの12倍の大きさということです。 おそらくCPUはIA32(x86)だと思うのですが、80bitの拡張精度をアラインメントの問題で、10バイトではなく12バイトにしているという事です。 この場合、long double の仮数部は64bitで、精度19桁です。 >エラーでましたが、これはい ...続きを読む
>こっちは、12桁まではOKということなのでしょうね。
ご存知だとは思いますが、この場合の12はcharの12倍の大きさということです。
おそらくCPUはIA32(x86)だと思うのですが、80bitの拡張精度をアラインメントの問題で、10バイトではなく12バイトにしているという事です。
この場合、long double の仮数部は64bitで、精度19桁です。

>エラーでましたが、これはいったい…
printf("%.16Le", A) が実行時にエラーを出すって事ですよね?
printfが%Lfとか%Leをサポートしていないのなら諦めるしかないかもしれません。
お礼コメント
lucky111

お礼率 74% (166/222)

ご返答ありがとうございます。
エラーは、
printf("%d, %d\n", sizeof(double), sizeof(long double));
を実行して、終わるときにでてくるようです。
投稿日時 - 2001-10-05 09:27:23
  • 回答No.6
レベル9

ベストアンサー率 36% (37/102)

勘違いされているところがあるようなので。 >ただ、LINUX付きのCコンパイラでやってみたところ、8,12とでました。 >こっちは、12桁まではOKということなのでしょうね 一般的に計算機では、実数は浮動小数点形式で扱います。 浮動小数点形式では、数値を (仮数部)×(底)^(指数部) の形式に変換します。 底は 2 に固定なので、仮数部と指数部で表現できることになります。 ...続きを読む
勘違いされているところがあるようなので。

>ただ、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の結果とは直接関係はありません。
お礼コメント
lucky111

お礼率 74% (166/222)

うむむむ… ややこしい。
結局、sizeofの結果はあまり意味がなかったのでしょうか。
投稿日時 - 2001-10-05 09:24:53
  • 回答No.7

>結局、sizeofの結果はあまり意味がなかったのでしょうか。 sizeofは変数または型が何バイトのメモリを使用するのかがわかるだけです。 なので、sizeof(long double) > sizeof(double)であるならば、long doubleはdoubleよりも精度が高いだろうという事になるのですが、cherry_moonさんが言っているように、実際の精度を意味するわけではあ ...続きを読む
>結局、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を使われるのがトラブルがないかなと思います。
お礼コメント
lucky111

お礼率 74% (166/222)

>sizeofは変数または型が何バイトのメモリを使用するのかがわかるだけです。
>なので、sizeof(long double) > sizeof(double)であるならば、long double
>はdoubleよりも精度が高いだろうという事になるのです

ありがとうございます。
どうも、色々わからないことがでてきたので、それだけで満足です。(^^;
投稿日時 - 2001-10-09 15:00:46
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ