- 締切済み
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とみなす』といった形で処理してけばいいのかと思いましたが、如何せん、コードが汚くなります。 良い方法をお持ちの方、教えて下さい☆
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jjon-com
- ベストアンサー率61% (1599/2592)
>今回はおそらく、指数の範囲を超える結果を出す演算であったので、 すでに倍精度実数を用いている状況でNaNのエラーになる,すなわち,倍精度以上の指数ケタが要求されるプログラムだということでしょうか。 現状のコードが短精度実数を用いているなら倍精度にするだけで解決するかもしれません。 http://www.eis.osakafu-u.ac.jp/~yabu/soft/fortran.html
- Tacosan
- ベストアンサー率23% (3656/15482)
どんな計算をした結果として NaN が出てきたのか, ちゃんと調査できてますか. それにしても, 「絶対値がある閾値以下になったら 0 にする」という処理で「if 文を使う必要がある」のは確かだけど, だからといってそんなにコードがきたなくなりますかね....
補足
単なる、見た目の問題です。 僕的に無いのを望んでいるだけですw 無しでもいけるなら、その方がすっきりとして、他人が見たときわかり易いですからね。 組み終わったら、人に渡すことになっているので、できれば、if文使わずにいけたらなぁ~と思っています。
補足
既に倍精度実数で行っています。