2020年04月23日

数値計算で四苦八苦して楽Cといいのにぃ

黒体輻射のプランク数式で絶対温度 T = 3K の宇宙背景放射の計算を1000THzまで計算しようとしてwxMaximaはコケた、Python Scipyもコケた。OverFlowだ。倍精度での最大値を超えたのだった。うむうむ。

doubleだと、wxMaximaでは exp(310)はOverFlowでエラー出して。
   Python もエラーだし。
倍精度最大値は10^308ぐらいでありexp(309)相当になるので。

だが、g++  ではOverflowは出なかった。

cout << exp(710);

結果は inf  と出た。
エラー出してプログラム終了ではないのだ。おや、そういうものだつたんですね。

ちなみに、 1/inf =====> 0って表示出しましたね、賢いですね。

g++  ------ 8.1.0

   まあなんかやると、いろいろと知らない事が出てきますわ。それだな、だからこそ、暇つぶしになる!!

         浅学非才!!  不勉強が身に染みる。出来の悪い学生の成れの果て!!  (笑)

稲、草、weed,

しかし、Google先生は賢いもので、なんという迅速な回答を!!

cout <<expl(710);

  こうすればよいのであった!!   long doubleという型があるではないか、C++言語には。

  これで1000THzまで計算できる!!   スバラシイ、わーいえむ・・・・・・・

cout <<expl(7100); これならOverflowだろ・・・と思ったら、
3.09615e+3083 と出た。
long doubleの場合は扱える数値範囲はどこまでだ?
IEEE-754 には128bitの規格があるが、ほんまに杓子定規にこれを実現しているわけではあるまい。CPU(FPU構造では80bitがHardwareとしてあるので、これだろ。

だが、long doubleで扱える範囲がちょ~拡大したのは分かる。
しゃーないから、1000THzまでC++で計算してグラフはGnuplot使えば良いのである。

やっぱC++かーーーー(´・ω・`)

posted by toinohni at 10:56| 東京 ☀| Comment(0) | ソフト系雑学 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください