- ベストアンサー
isnanの取り扱いについて
fortranで,isnanという,変数がNaNか否か判定する関数がありますが,それについて教えていただきたいことがあります. 引数が"NaN"であるときとないときで,計算のやり方で場合わけをして計算をさせたいのですが,知り合いからもらったサンプルプログラムでは, if(isnan(hikisu))then NaNの場合の計算 else そうでない場合の計算 endif と書いてありました.これを参考にして計算コードを書いたのですが,digital visual fortranではコンパイルできたのですが,UNIXのコンパイラを使ったらコンパイルできませんでした. こういう場合は,どのように書いたらよいのでしょうか? また,isnanの型の宣言は,どのようにして行うのがよいのでしょうか.
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
sxf90 って名前のFortran コンパイラを知らなかったので調べてみたところ これ、スパコン用のコンパイラじゃないですか? とすると、そのスパコン(SX-8?)でUNIXがうごいているとかいないとか以前に、 浮動小数点数のフォーマットが通常良くあるIEEE-754なのか って疑問があるんですがどうなんでしょう。 どういうアルゴリズムとロジックでNaNが出てくるプログラムなのか わかりませんが、NaNというデータ型を使えるのかどうか ちょっと疑問です。 isnanなる関数の型はまあ LOGICAL isnan(REAL) とかじゃなかろうかと思いますが、たぶん自分で関数本体を書かなきゃいけないんじゃないかなあ。
その他の回答 (3)
- colder
- ベストアンサー率43% (30/69)
> 「IMPLICIT NONE文があるのに、名前isnanの型を明示的に宣言していない。」 IMPLICIT NONE文の意味を考えれば当然かと思いますけど。 #2さんも言っていますが、Fortranには、isnanなんていう組込み関数は存在しません。 NaNであるかどうかを調べるためのために、IEEE_ARITHMETICモジュール内にIEEE_IS_NAN関数がFortran 2003で追加されました。 まず、コンパイラのマニュアルを調べてこれらの関数が利用できるか確認する必要があります。 これらの関数が利用できない場合、自分自身との比較(hikisu .NE. hikisu)で判定できる可能性があります。 この方法でもうまくいかない場合は、isnan関数を自作するしかありません。
お礼
ありがとうございました.isnanがないとのことでした. コンパイラのマニュアルを調べて,使える関数を探すか,コード自体を練り直して見ます.
- sakusaker7
- ベストアンサー率62% (800/1280)
多分Link時に未定義エラーになったというパターンだと思います。 また、UNIXのコンパイラというのは g77 か g90 あたりですか? 標準には isnan という組み込み関数はないっぽいので、digital visual Fortranで コンパイルできたというのは、多分それが拡張として持っていたのでしょう。 それはさておき、Cのちょっとしたプログラムを書いて Cのライブラリにあるだろう isnan を使ってしまうのが一番手っ取り早いと思います。 FortranプログラムとCプログラムをどうリンクするかは お使いのシステムのマニュアルを参照してください。
補足
コンパイラは,sxf90というコンパイラです.それを使ったら,No.1の方のご回答の補足に書いてあるエラーが出てきました.
- colder
- ベストアンサー率43% (30/69)
どのようなエラーメッセージが出ましたか? 補足にどうぞ。
補足
「IMPLICIT NONE文があるのに、名前isnanの型を明示的に宣言していない。」というエラーでした.
お礼
本来,スパコンを使うような計算ではないのですが,エラーの意味が日本語で出てくるという理由で使ってみました. sxf90のマニュアルを見てみたら,確かにありませんでした. 書き方を練り直してみます.ありがとうございました.