• ベストアンサー

isnanの取り扱いについて

fortranで,isnanという,変数がNaNか否か判定する関数がありますが,それについて教えていただきたいことがあります. 引数が"NaN"であるときとないときで,計算のやり方で場合わけをして計算をさせたいのですが,知り合いからもらったサンプルプログラムでは, if(isnan(hikisu))then NaNの場合の計算 else  そうでない場合の計算 endif と書いてありました.これを参考にして計算コードを書いたのですが,digital visual fortranではコンパイルできたのですが,UNIXのコンパイラを使ったらコンパイルできませんでした. こういう場合は,どのように書いたらよいのでしょうか? また,isnanの型の宣言は,どのようにして行うのがよいのでしょうか.

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

sxf90 って名前のFortran コンパイラを知らなかったので調べてみたところ これ、スパコン用のコンパイラじゃないですか? とすると、そのスパコン(SX-8?)でUNIXがうごいているとかいないとか以前に、 浮動小数点数のフォーマットが通常良くあるIEEE-754なのか って疑問があるんですがどうなんでしょう。 どういうアルゴリズムとロジックでNaNが出てくるプログラムなのか わかりませんが、NaNというデータ型を使えるのかどうか ちょっと疑問です。 isnanなる関数の型はまあ LOGICAL isnan(REAL) とかじゃなかろうかと思いますが、たぶん自分で関数本体を書かなきゃいけないんじゃないかなあ。

asa_hikawa
質問者

お礼

本来,スパコンを使うような計算ではないのですが,エラーの意味が日本語で出てくるという理由で使ってみました. sxf90のマニュアルを見てみたら,確かにありませんでした. 書き方を練り直してみます.ありがとうございました.

その他の回答 (3)

  • colder
  • ベストアンサー率43% (30/69)
回答No.4

> 「IMPLICIT NONE文があるのに、名前isnanの型を明示的に宣言していない。」 IMPLICIT NONE文の意味を考えれば当然かと思いますけど。 #2さんも言っていますが、Fortranには、isnanなんていう組込み関数は存在しません。 NaNであるかどうかを調べるためのために、IEEE_ARITHMETICモジュール内にIEEE_IS_NAN関数がFortran 2003で追加されました。 まず、コンパイラのマニュアルを調べてこれらの関数が利用できるか確認する必要があります。 これらの関数が利用できない場合、自分自身との比較(hikisu .NE. hikisu)で判定できる可能性があります。 この方法でもうまくいかない場合は、isnan関数を自作するしかありません。

asa_hikawa
質問者

お礼

ありがとうございました.isnanがないとのことでした. コンパイラのマニュアルを調べて,使える関数を探すか,コード自体を練り直して見ます.

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

多分Link時に未定義エラーになったというパターンだと思います。 また、UNIXのコンパイラというのは g77 か g90 あたりですか? 標準には isnan という組み込み関数はないっぽいので、digital visual Fortranで コンパイルできたというのは、多分それが拡張として持っていたのでしょう。 それはさておき、Cのちょっとしたプログラムを書いて Cのライブラリにあるだろう isnan を使ってしまうのが一番手っ取り早いと思います。 FortranプログラムとCプログラムをどうリンクするかは お使いのシステムのマニュアルを参照してください。

asa_hikawa
質問者

補足

コンパイラは,sxf90というコンパイラです.それを使ったら,No.1の方のご回答の補足に書いてあるエラーが出てきました.

  • colder
  • ベストアンサー率43% (30/69)
回答No.1

どのようなエラーメッセージが出ましたか? 補足にどうぞ。

asa_hikawa
質問者

補足

「IMPLICIT NONE文があるのに、名前isnanの型を明示的に宣言していない。」というエラーでした.

関連するQ&A

  • Fortran "実引数の型が仮引数の型と異なります。"

    Fortran "実引数の型が仮引数の型と異なります。" Intel Visual Fortranの最新版をMS Visual Studio 2008で使用(お試し)しています。 既存のFortranプログラムでエラーが出て、使えなくなりました。 問題点を要約すると以下のようなシンプルなコードに集約されました。 ---------------------- 00 program main 01 call sub1(10.d0) 02 call sub1(10.0) 03 end ! ---------------------- 04 subroutine sub1(rr) 05 real*8 rr 06 write(*,*) 'rr = ', rr 07 end subroutine ! --------------------- 昔のFortranでは、Subをcallする時に、仮引数の型と厳密に一致していなくても、うまく処理してくれたと思います。(倍精度でも整数でも、同じ数値とみなして) オプションのルーチンインターフェースのチェック(/warn:interfaces)をオフにすると、コンパイルは出来るようになるのですが、上記プログラムの計算結果は、01行と02行で結果が異なってきます。 (02行はおかしな値が入る) 本来、ランタイムエラー防止の観点からは、このような厳密性を要求するのは良いことだと思いますが、既存のプログラムが実行できなくなるのは痛手なので、何かオプションの変更で対応出来ないものでしょうか? よろしくお願いいたします。

  • fortran77のend ifの個数について質問です。

    他人が作ったfortran 77のプログラムを使うことになったのですが、if文の数とend if文の数が合わずに混乱しています。コンパイルも実行も出来るのですが自分の中では納得いきません。具体的に言うと、 =============== if (aa.gt.bb) then  計算 if (cc.gt.dd) then  計算 else  計算 end if  計算 if (ee.gt.ff) then  計算 end if =============== と言った具合です。この場合1つめのif文に対応するend ifがないと思うのですが…なぜコンパイルがうまくいくのか教えてください。

  • Fortranのバージョンアップと古いソースコード

    Fortranは科学技術計算の古い資産が使えるということでまだ使われていると思います。 しかも、コンパイラ・リンカは製品としてバージョンアップしているわけですが、新しくなっても古いコードはコンパイル・リンク・実行できると思っていました。最近、intel fortranの更新をしたのですが、動作がかなり違ってきました。F77,F90,F95などの更新ではなく、intel社の製品としての最新版への更新です。コンパイル・リンクまでは行くのですが、実行させたとたん、ゼロ割のようなメッセージが出て、実行が打ち切られてしまいます。1時間ぐらい走るプログラムなのですが、1秒で打ち切りでした。必ずそうなるということではありません。特定のライブラリで生じます。そのライブラリは古い(言語としてはF77)ので当然ながら新しいコンパイラで動くなどと書いていません。ただソースコードの塊であり、古いコンパイラでは動いていたのです。古いと行っても2009年ぐらいに買ったintel visual fortran ver.11ぐらいのもので2016年のコンパイラと大幅な変更はないはずなのですが。例えば最新版(2016年2月時点)の方は並列関係の設定の方がデフォルトで並列計算しない設定をコンパイラオプションで指定しないとおかしくなるということでしょうか(たぶんGPUには対応していないと思いますが)。どっかに書いてあるかなと思案していますが。 何か心当たりがあればよろしくお願いします。

  • 複数のソースファイルのコンパイルの仕方

    とある人からいただいた,fortranの計算プログラムを使おうと思っております.ソースファイルが1個だけというのであれば,フリーのコンパイラを使って実行した経験があるのですが,今回譲り受けたものは,ソースファイルが複数あります(メインプログラムとサブルーチンプログラム数個). コンパイラはvisual fortranなのですが,マニュアル等がない状態です.どなたか,お教え願えませんでしょうか? よろしくお願いいたします.

  • Fortranのサブルーチン引数について

    他人が作ったFortran(恐らくFortran77)のプログラムで計算をしようとしています。 コンパイルはできるのですが,実行するとエラーが出てしまい困っています。 エラーメッセージは 「forrtl:severe(157):Program Exception - access violation」 となっていて,実行時エラー番号で調べると 「プログラムが適切な参照権を持っていない仮想アドレスに書き込み,または読み取り を行おうとした」と出ていました。 Fortran初心者の自分にはイマイチ意味が判らないのですが,エラーが出た後に サブルーチンのある決まった場所に黄色い矢印が示されます。 そこで今,その部分のサブルーチンを確認しているところです。 前置きが長くなってしまいましたが サブルーチンの中を確認している途中で疑問に思った所が一つあります。 問題のサブルーチンは --------------------------------------- call dbesl(EN,0,BX0,BY0,BI0,BK0)     subroutine dbesl(X,NOR,BX,BY,BI,BK) FN = NOR  ・  ・  ・ 11 NOR = FN               <---この行に黄色い矢印が出る return end --------------------------------------- となっているのですが,サブルーチンを呼び出すcall文の所で 2つ目の引数が『0』となっているのは正しい使い方なのでしょうか? どうもサブルーチン内の計算をしてメインプログラムに引数を返す所が おかしいような気がしています。 因みにメインプログラムに戻る際の"FN"の値は『0』となっていました。 コンパイラはCompaq Visual Fortranを使用しています。 足りない情報は出来るだけ追記していきますので,ご教示宜しくお願いします。

  • Fortran : 複数の.fファイルのコンパイル

    先輩からあるシミュレーションコードをもらったので、Cygwin上でコンパイラにgfortranを用いてプログラムを回したいのですが、複数の.fファイルと.hファイルが有りどうすればコンパイルできるのか解りません。gfortran ???←ここのコマンドがわかりません。 全くのド素人だと思ってください。 先輩にはVisual Fortranを用いているので解らないと言われてしまいました。 どなたかアドバイスお願いします。

  • fortran77 include文

    Intelのifcコンパイラでコンパイルしようとすると、fortran77で書かれたコード内のinclude文を読み込んでくれないのですが、この場合なにか対処法はありますか?教えてください。

  • 数値計算の高速な実行

    Fortranで記載している数値計算プログラムを高速に実行したいのですが、 1) コンパイルは64bitで行なった方が早いでしょうか? 2) 現在お薦めなCPUはCore 2 Duoでしょうか? コンパイラはintel fortran、OSはCentOSを使用予定です。 その他、数値計算の高速化に関してお薦めがありましたらお願いいたします。

  • プロトタイプ宣言について

    C言語で関数を作成しプロトタイプ宣言するときの質問です。 関数実体の引数に構造体のポインタを宣言します。 プロトタイプ宣言には,構造体のポインタを宣言したのと同じ位置にvoid *を宣言します。 関数実体とプロトタイプ宣言は,異なるファイルです。 このように作成した関数は,VC++2008では,コンパイルできるのですが, なぜ関数実体の宣言とプロトタイプ宣言の型が異なるのにコンパイルできるのでしょうか? また,この関数を別ファイルの関数から呼び出した場合,正しく引数を理解し,正しく処理されます。 これは,言語仕様として正しい書き方なのでしょうか? それとも環境依存の書き方なのでしょうか? ご存知の方がいましたらお答えお待ちしています。

  • CとJavaはどのくらいスピードが違うの?

    BorlandのJBuilderなど、Javaもネイティブコードコンパイラがありますよね。質問ですが、 (1) UNIXで動くJavaのネイティブコードコンパイラで優秀なものはあるのでしょうか。 (2) C言語でコンパイルしたプログラムとJavaでネイティブコードコンパイルしたプログラムは、どのくらい速度に差があるのでしょうか? たとえば、Visual Basicも最近のバージョンはネイティブコードコンパイルができますが、C言語で作った同じ論理構造のプログラムに比べて、やはり、かなり実行速度が劣ります。

専門家に質問してみよう