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

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

とすると、8桁しか出力されません。
これを16桁まで出力させる方法はないでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

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



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

doubleの精度は15桁なので、微妙なところですね。
    • good
    • 1
この回答へのお礼

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

ちなみに実行してみたところ、エラーでましたが、これはいったい…

お礼日時:2001/10/04 09:33

>結局、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を使われるのがトラブルがないかなと思います。
    • good
    • 1
この回答へのお礼

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

ありがとうございます。
どうも、色々わからないことがでてきたので、それだけで満足です。(^^;

お礼日時:2001/10/09 15:00

勘違いされているところがあるようなので。



>ただ、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の結果とは直接関係はありません。
    • good
    • 0
この回答へのお礼

うむむむ… ややこしい。
結局、sizeofの結果はあまり意味がなかったのでしょうか。

お礼日時:2001/10/05 09:24

>こっちは、12桁まではOKということなのでしょうね。


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

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

ご返答ありがとうございます。
エラーは、
printf("%d, %d\n", sizeof(double), sizeof(long double));
を実行して、終わるときにでてくるようです。

お礼日時:2001/10/05 09:27

間違いました。

16桁表示ですよね。
printf("%.16e\n", A);
です。

単に16桁の精度表示(1.1234567890123456e+18)したいだけならlong doubleにする必要はないですよ。
    • good
    • 0
この回答へのお礼

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

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

そうなのですか。long doubleって一体…

お礼日時:2001/10/03 23:47

No.1の方のは記述ミスがあります。


精度を指定するならこのように書いてください。
printf("%.18e\n", A);
    • good
    • 0

long double と言うのが、?状態ですが、普通に精度指定を


すれば、大丈夫ではないでしょうか。

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

と言う風に、、、
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。

お礼日時:2001/10/03 23:48

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q構文中の『\n』、『\n\t』について

構文中の『\n』、『\n\t』について

下記のC言語構文中の『\n』、『\n\t』の部分がどうしてもわかりません。

#define SLEEP asm volatile("sleep\n"::)
または
#define SLEEP asm volatile("sleep\n\t"::)

ご教授下さい。
よろしくお願い致します。

Aベストアンサー

『\n』は改行、
『\n\t』は改行して、(行頭に)タブを入れる。
 

Qprintf( "%d", i % 10 );で?

int count;
int i;
scanf( "%d", &count );
for( i = 0 ; i < count ; i++ )
printf( "%d", i % 10 );「iを10で割った余り」だそうです。
i%5とした場合、 
 仮に5と入力すれば、01234と表示すると思いますが、
何でiを5で割れば5進数みたいにコンピュータが認識するのですか?
理論だけ勉強中で、実際試したことがありません? 
よろしくお願いします。

Aベストアンサー

例えば、246を例に考えてみます。

246を5で割ると49で余りが1

これは書き換えると
246 = 49x5 + 1 という事ですね。

次に49について同様に行なうと
49を5で割ると9で余りが4

これは書き換えると
49 = 9x5 + 4という事ですね。

最初の結果とあわせると、
246 = 9(x5x5) + 4(x5) + 1
という事ですね。

同様に9についても計算すると

246 = 1(x5x5x5) + 4(x5x5) + 4(x5) + 1

となります。


5で割った答えと5で割った余りは、5進数で一つ上の桁へ移せる部分とその桁に残る部分を分けている事になります。
10進数でも32を考えた時、30の部分は上の桁に移せる部分で(10で割った答え部分)2はその桁に残る部分(2 = 32 % 10)ですよね。

Qprintf("文字列\n")が円マークなんです!!斜線がでない!!

うちのノートパソコン(IBM)OSはTurbolinux Personalと、デスクトップ(NEC)OSはWindows2000でC言語のプログラミングをすると文字が変なんです。

printf("文字列\n");

と改行のエスケープシークエンス?を入力すると円マーク(\)なんです!!

右下がりの斜線のキーを押してるのに円マーク(\)しかでないんです。二つのPCどちらでやってもです。C言語のテキストでは右下がりの斜線とnで改行のエスケープシークエンス?になっているので見ていて気持ちが悪いです・・・。

ちゃんと右下がりの斜線は出せないものでしょうか。ちなみにキーボードには右下がりの斜線が書いてあります。

プログラミング上も\nで右下がりの斜線と同じ、改行の意味で理解されているらしく、ちゃんと改行されます。

でも右下がりの斜線じゃないと気持ち悪い・・・。直せませんか?

Aベストアンサー

日本語環境だと、\で正解です。
同じ意味(文字コード)です。


\(の半角)は バックスラッシュといいます。
日本語フォントでは、歴史的な原因で \ の文字コードと同じものが割り当てられていますので、日本語フォントで表示している限り、 ¥(半角)が表示されます。


歴史的背景をここで解説すると文字数足りなくなりますので。
ここ
http://ja.wikipedia.org/wiki/%5C
や、ここ
http://ja.wikipedia.org/wiki/%E5%86%86%E8%A8%98%E5%8F%B7
を読んでください。

Qprintf("\a");のアラーム音

言語:c

#include <stdio.h>

int main ( void ) {
printf("\a");
return (0);
}

上記のプログラムを実行すると、
アラーム音(?)が鳴ります。

音が出ている場所がスピーカからではなくて、
PCの本体から出ているようです。

なぜスピーカから鳴らないのでしょうか。
なぜPC本体から鳴っているのでしょうか。

Aベストアンサー

環境にもよるのですが…Windowsですか?一般的なPCの場合、
スピーカからなる宇和揺る普通のサウンドの他に、BEEP音源というのがありまして。
こちらはデバイスが違うのでPC本体から直接音が鳴ります。
# 現在では、例えばシステムの異常を通知するような時くらいしか使われないかも。
で、\aにこちらが使われるのは、多分にMS-DOS時代からの歴史的な経緯じゃないかと思います。
昔はコレでも普通でしたし、
\aは「何か音がなればいい」というものであって、どんな音を鳴らすかは別に決まってないですし、
めったに使われないので綺麗なサウンドとか必要ないと思いますし、
OSがおかしくてもなる可能性がBEEPの方が高いかもしれませんし…。

Qe(自然対数の底)を100桁以上出力printfする

どの型の範囲も超えてしまうので配列で表現したいのですがうまくいきません。よろしくお願いします

Aベストアンサー

 この問題を解く鍵は、多倍長演算と言います。倍精度実数でさえ表示しきれない桁数の4則演算と、その数の表記に関する技術のことです。
 結構、奥深い分野の問題で、全部をここに書き切れません。
 とりあえず、「多倍長演算」をキーにして、google等で検索してみてください。たくさんの技術解説書と、同じく、たくさんのライブラリーが出てきます。
 単に、数を表現するのが目的で、演算方法なんてどうでもよいのであれば、ライブラリーを探してみるのが手っ取り早いでしょう。

 ちなみに、大きな数を配列で表現しようと言う、その発想そのものは正しいです。


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報