
No.4ベストアンサー
- 回答日時:
long doubleのときは、eの代わりにLeを使います。
long doubleがサポートされていたとしても、精度はまちまちです。doubleと全く同じ場合もあるでしょうし、80ビットや128ビットであることもあります。
printf("%d, %d\n", sizeof(double), sizeof(long double));
のように確認してみれば、使う意味があるかどうかはわかります。
doubleの精度は15桁なので、微妙なところですね。
ご返答ありがとうございます。
VC++でやってみたところ、両方とも8でした。
ただ、LINUX付きのCコンパイラでやってみたところ、8,12とでました。
こっちは、12桁まではOKということなのでしょうね。
ちなみに実行してみたところ、エラーでましたが、これはいったい…
No.7
- 回答日時:
>結局、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よりも精度が高いだろうという事になるのです
ありがとうございます。
どうも、色々わからないことがでてきたので、それだけで満足です。(^^;
No.6
- 回答日時:
勘違いされているところがあるようなので。
>ただ、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の結果とは直接関係はありません。
No.5
- 回答日時:
>こっちは、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));
を実行して、終わるときにでてくるようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の型による処理速度の違い
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C言語で表記についの質問です
-
doubleは常に%lfとするべきなのか
-
int とdoubleの比較
-
C言語でsqrt(a^2+b^2)のテーブ...
-
至急です! マクロ定義で #defi...
-
C 開放してるのにエラー(doubl...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
ラグランジュの補間法のCプログ...
-
Cプログラムについて
-
C言語 入力した数値の平均値の...
-
difftime()について
-
main.c:7:43: warning: implici...
-
「指定されたキャストは有効で...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
20'(角度)の計算がわかりま...
-
「Aに対するBの割合」と「Aに対...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
C言語を実行すると-infが出てき...
-
C言語の型による処理速度の違い
-
c言語で、繰り返し文の中で、0....
-
C言語 関数プロトタイプ宣言の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
-1.#IND00と出てしまうのですが...
-
c言語のプログラミングについて...
-
C言語で台形公式を使った二重積...
-
C言語でdouble型の小数点の引き...
-
2次方程式の解を求めるプログ...
-
C言語のプログラムで#include<m...
-
C言語の複素数についてです。
-
doubleは常に%lfとするべきなのか
-
difftime()について
-
関数におけるif文とreturn文に...
-
c言語のコンパイルエラー canno...
おすすめ情報