• ベストアンサー

C言語で-23乗を取り扱うには

C言語でボルツマン定数 1.38*10^(-23) を取り扱いたいと思っています。 k = 1.38/pow(10, 23); あるいは k = 1.38/100000000000000000000000; としても、コンパイルはできますが実行したときに 『1.#INF00』 という表示(マイナス無限大?)が出てしまいます。 このようにとても小さな定数をC言語で扱う場合、 どのようにすればよいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

#include <stdio.h> int main(void) { double k = 1.38e-23; printf("ボルツマン定数K=%e\n", k); return 0; }

その他の回答 (7)

回答No.8

もしかしたら k が int になっているとか? あと、Cの範囲であれば、math.h が include されていれば、pow(10, 23) という書き方は問題ありません。 ちゃんと、double pow(double, double) というテンプレートを理解して、コンパイラが型変換をしてくれます。 C++だと、doble pwo(double, double) と logn double pow(long double, long double) と2つ (もしかしたらそれ以上)存在するので、「型変換ができない」というコンパイルエラーになりますが。

回答No.7

#1さんのように "%e" で出力するようにする。 また 、pow(10,23) は  pow(10.0, 23.0) の実数にしなければ正しい結果は得られませんよ。 http://www.bohyoh.com/CandCPP/C/Library/pow.html #include <stdio.h> #include <math.h> int main(void) { float k; k=1.38e-23; printf("case 1: k= %f(%f)\n", k, 1.38/pow(10.0,23.0)); printf("case 2: k= %e(%e)\n", k, 1.38/pow(10.0,23.0)); return 0; } ----- 実行結果 ----- case 1: k= 0.000000(0.000000) case 2: k= 1.380000e-23(1.380000e-23)

noname#137556
noname#137556
回答No.6

#3 です。 > 『1.#INF00』 よく見ると '-' 付いてませんね。正の無限大でした ^^;

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.5

どうしたら、質問のようになりましたか。 k = 1.38/pow(10, 23); または、 k = 1.38*pow(10, -23); これはいいが、 k = 1.38/100000000000000000000000; これはだめでしょう。 こんな大きい整数はないので、 kをdoubleで宣言して、 k = 1.38/100000000000000000000000.; とすれば、通るでしょう。 VS2008では通ります。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

そのような表示になってしまうプログラムの簡単な例を出してもらえますか?

noname#137556
noname#137556
回答No.3

負の「無限大」なので、表現できないくらい大きいということですね。負側に。 ということは、 > k = 1.38/pow(10, 23); > k = 1.38/100000000000000000000000; だけでは、1.#INF00 にはなりません。 これを使って計算した結果が、そうなっている可能性はあります。(単精度だと怪しいかも) でも、ぜんぜん違うところの計算ミスかもしれないです。 # IEEE 754 の倍精度(うちの環境では double 型)ですと、 # 指数部が 11 ビットなので、ざっくり言って 2^±1000 ぐらいまでは表現できます。

  • k_kota
  • ベストアンサー率19% (434/2186)
回答No.2

long doubleでいけるんじゃないか、と思ったのですが、 結局doubleと同じになる場合も多いみたいです。 表示は無限小ですね、表現仕切れないくらい小さいと言う意味です。 倍精度じゃ出せないのはデータ構造を考えると明らかです。 ザックリ計算でも2^(-70)より小さいですからね。 仕様として最初から無いものですので、拡張する必要があります。 多分どこかでライブラリがあると思いますが、 自分で新しく構造体とかで作ることもできます。 例えばintの仮数部とintの指数部を持つ構造体を定義して、それぞれ四則の計算を関数として準備する。 その他の数学関数は使うものを独自に定義して拡張する。 そういう方法で対応ができないことはありません。