• 締切済み

fortran

fortran コンパイルして、走らせると・・ こんなエラーが出てきました。 『NaN』 調べたところ、 非数 (NaN) 非数 (NaN) は、指数がとることのできる最も大きな値 (すべて 1) とゼロ以外の小数部により表わされます。 正規化された REAL および DOUBLE PRECISION 数値は、メモリーに格納されているよりビットの精度が 1 つだけ多い暗黙的先行ビットを持っています。たとえば、IEEEの倍精度は小数部に格納された 52 ビットに暗黙的な先行をする 1 ビットを加えた 53 ビットの精度になります。 NaNが出てくる例としては、 big*big = +Inf 正の無限大 big*(-big) = -Inf 負の無限大 num/0.0 = +Inf num > 0.0 のとき num/0.0 = -Inf num < 0.0 のとき 0.0/0.0 = NaN 非数 の他にも、次のような 5 つの種類の浮動小数点例外も発生します。 無効演算 - 数学的に定義できない演算。0.0/0.0、sqrt(-1.0)、log(-37.8) など。 ゼロ除算 - 除数がゼロで、被除数が有限かつゼロでない数。9.9/0.0 など。 オーバーフロー - 指数の範囲を超える結果を出す演算。 MAXDOUBLE+0.0000000000001e308 など。 アンダーフロー - 通常の数として表現できないほど小さな結果を出す演算。 MINDOUBLE * MINDOUBLE など。 結果不正確 - 無限に正確に表現できない結果を出す演算。2.0/3.0、log(1.1)、0.1 の入力など。 今回はおそらく、指数の範囲を超える結果を出す演算であったので、オーバーフローと判断しています。 この対処としては、そのようになる項、値に対して、頻繁にif文を用いて、『10の-20以下であれば0とみなす』といった形で処理してけばいいのかと思いましたが、如何せん、コードが汚くなります。 良い方法をお持ちの方、教えて下さい☆

みんなの回答

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

>今回はおそらく、指数の範囲を超える結果を出す演算であったので、 すでに倍精度実数を用いている状況でNaNのエラーになる,すなわち,倍精度以上の指数ケタが要求されるプログラムだということでしょうか。 現状のコードが短精度実数を用いているなら倍精度にするだけで解決するかもしれません。 http://www.eis.osakafu-u.ac.jp/~yabu/soft/fortran.html

BOY12345
質問者

補足

既に倍精度実数で行っています。

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

どんな計算をした結果として NaN が出てきたのか, ちゃんと調査できてますか. それにしても, 「絶対値がある閾値以下になったら 0 にする」という処理で「if 文を使う必要がある」のは確かだけど, だからといってそんなにコードがきたなくなりますかね....

BOY12345
質問者

補足

単なる、見た目の問題です。 僕的に無いのを望んでいるだけですw 無しでもいけるなら、その方がすっきりとして、他人が見たときわかり易いですからね。 組み終わったら、人に渡すことになっているので、できれば、if文使わずにいけたらなぁ~と思っています。

関連するQ&A

  • fortranでのNaNについて

    お忙しい所、NaNについて回答お願い致します。 fortranでプログラムを使用して数値計算を行っていますが、計算途中で結果がNaNとなり困っています。 NaNは、0で除算を行なったり、負の数の指数を求めようとした時に出る無限大や定義できない値のようなのですが、式を見ても0で除算を行なったり、負の数の指数を求めようとしている所はありません。 もし同じような経験をされて見事解決された方、居られましたらその時の対処法をお聞かせ願えないでしょうか。 何卒よろしくお願い致します。

  • 2進数の減算のオーバーフロー/アンダーフロー

    2進数の減算のオーバーフロー/アンダーフロー 2進数の加減算においてどういうときにオーバーフローするのかわかりません。 例えば、 符号付き整数加算として、 1111+0001=10000 となり、4ビットで表現しきれないので、この場合オーバーフローということでしょうか? 基本的に、元々のビット列の長さ(この場合、4ビット)を演算後、超えてしまう 結果となった場合、オーバーフロー、アンダーフローが起きていると考えてしまって よいのでしょうか? 10進数に変換して10進数の演算結果と異なることが分かれば、オーバーフローが 起きているといえるのでしょうが、ビット長が100ビットなど多ビット長の場合に そのようなことはできないので、簡単なオーバーフロー、アンダーフローの見分け方が 知りたいです。 ご回答お願い致します。

  • 浮動小数点数の内部表現について教えてください

    float型の内部表現を表示するプログラムを書いていくつか試してみたのですが、どこからどこまでが仮数部でどこからどこまでが指数部なのか良くわかりません。 曲がりなりにも自分で考えた結果は次のとおりです。 10進表示: 内部表現 ;2進の指数表現 2 :01000000000000000000000000000000;10.0*10^0 4 :01000000100000000000000000000000;10.0*10^1 8 :01000001000000000000000000000000;10.0*10^10 16:01000001100000000000000000000000;10.0*10^11 32:01000010000000000000000000000000;10.0*10^100 また、 1 :00111111100000000000000000000000;0.1111111*10^0 0.5 :00111111000000000000000000000000;0.0111111*10^0 0.25:00111110100000000000000000000000;? 0.125:00111110000000000000000000000000;? 0.0625:00111101100000000000000000000000;? となりました。最上位ビットが符号だということは分かります。 質問をまとめると、 (1) 10進で 0.5 の2進指数表現は 0.0111111*10^0 ということなのでしょうか。もしそれで正解なら、どうして 0.1*10^0 としないでわざわざ丸め誤差を含む無限小数で表すのでしょうか。 (2) 仮数部と指数部のビットは決められていなくて、例えば状況によって仮数部のビットが少なくなり指数部のビットが多くなったりするのでしょうか。 (3)仮数部での小数点はどこにあるのでしょうか。 (4)float 型の小数精度は最小6桁ということですが、これは10進で6桁なのか2進で6桁なのか教えてください。 どれか一つでも教えていただけると助かります。 使ったコンパイラは Borland C++ Compiler 5.5 です。 }

  • javaで1.8x10の308乗÷(ー1.8x10の308)乗割り算をしたいです。

    java初心者です。下記の割り算するプログラムが できません。ご指導下さい。実行結果はコメントどめ しました。 /*num1=1.8x10^308,num2=1.8x10^308としnum1/num2,(-num1)÷(-num2)、num1/0を計算する。 実行結果 C:\keisanclass>java WarizanMain 1.8 1.8 NaN 演算不可能と表示されました。 C:\keisanclass>java WarizanMain -1.8 -1.8 NaN 演算不可能と表示されました。 C:\keisanclass>java WarizanMain 1.8 0 Infinity 無限大と表示されました。 */ class WarizanMain { public static void main(String args[]) { double num1=0.0; double num2=0.0; num1=Double.parseDouble(args[0]); num2=Double.parseDouble(args[1]); double z = Math.pow(10,308); System.out.println((num1*z)/(num2*z)); } }

    • ベストアンサー
    • Java
  • 浮動小数点表現

    2^{24}を32bit整数表現及び32bit(単精度)浮動小数点表現で表せ。 結果は16進数で示せ。 符号ビット:MSB 指数部n:7ビット 仮数部:24ビット という問題があるのですが、 解いてみたものの、答えもないのであっているのか分かりません。 以下の答えで合っているでしょうか? また、合っていなかったら、どのように解くのか教えていただけませんか? 整数表現 0100 0000H 浮動小数点 0100 1000 0100 0000 0000 0000 0000 0000

  • IEEE754 浮動小数点の問題

    -10.375(10進数)をIEEE754規格の単精度浮動小数点表現のビット列で示せ。という問題で、 ・仮数部の符号ビットが1bitで指数部が8bitで仮数部が23bitで合計32bitでいいんですよね?本によって割り当てが違うんですけど。 ・僕自身この問題を解いた結果、1 10000010 0100110・・・0 (一番前が、符号bit。真中が指数bit。一番後ろが仮数bit) で合っていますか?答え合わせのほどを。 どうか、願いします。

  • 有理数で構成される分数を循環させない無限小数にする

    有理数で構成される分数を循環しない無限小数にすることが できないという証明は可能でしょうか? 有理数の四則演算は閉じている(この表現OKでしょうか?)そうですが、 有理数で表された分数が循環小数でなく、循環しない無限小数に ならないことが理解できません。定義(?)として無理やり頭に 入れることは避けたいのですが・・・

  • 無限小数を0にする方法

    ある無限小数であるdを0にする方法は、どんな方法でしょうか? 1. dを用いない。  d - d = 0 は、なしです。 2. 0を用いない。  d * 0 = 0 は、なしです。 3. 用いる、dや0以外の数と演算子の数は、有限個。  3.は要らないかも。 どんな無限小数をも0にし得るでしょうか? し得る証明や、し得ない証明を教えてください。

  • JavaScriptの演算精度は?

    JavaScriptの演算にはIEEE 754が使用されていると聞いたのですが、その演算の精度はどれくらいですか? 小数を丸めて正しい答えを導きたいのですが、その場合どの桁を四捨五入すれば最も精度が良いですか? また、どれくらいの数までであれば正確に計算できますか? 体感的には15桁程度であれば正確だと考えています。 さらに、四捨五入を行う際に*1000000してから四捨五入し、あとで1000000で割ったりしようと思うのですが、その場合も桁溢れなどの可能性がありますか? 電卓を作成しようとして、精度につまずきました。 利用者に精度の説明をしたいのですが詳しくないため、困っています。 CPUが32bitの場合と64bitの場合の両方で教えて欲しいです。 ご存じの方がいらっしゃいましたらよろしくお願いしたします。

  • CPUの処理性能(クロックサイクルと演算回数)について

    CPUの処理性能の計算について、わかる方のお知恵を貸してください。 http://journal.mycom.co.jp/articles/2010/01/03/supercomputer2010/index.html の記事の中ほどに、以下の記述があります。 ---------------------- POWER7はPOWER ISA2.0.6に準拠しており、コアあたり4個の積和演算器を搭載し、サイクルあたり8つの倍精度浮動小数点演算を行うことができる。現在のIntelのNehalemコアが4演算であるのと比較すると2倍の演算数で、次世代のSandy Bridgeの演算数を先取りしている。 ---------------------- この、「4個の積和演算器で、サイクルあたり8つの倍精度浮動小数点演算を行うことができる」とは、このCPU(POWER7)の積和演算器は1サイクルで2つの倍精度浮動小数点演算を行うことができる仕様という意味でしょうか? そもそも、1サイクル=2演算というのは、個々の演算器の仕様に問わず常識的な意味なのでしょうか?

専門家に質問してみよう