特殊な値
    Top > Fortran > その他
    Index 目次
    NaN Definition of NaN Making NaN Judging NaN Infinity Definition of Infinity Making Infinity Judging Infinity Sample
    NaN
    Definition of NaN 非数.Not A Numberの略で,そのバイト数の浮動小数点数では表現されない値を指す.正の無限大及び負の無限大とは区別される. 指数部が全て1, 仮数部が全て0でない(いずれかが1の)ビット列.倍精度では 1 11111111111 1111111111111111111111111111111111111111111111111111, 0 11111111111 1000000000000000000000000000000000000000000000000000 など. なお浮動小数点数は一般に 単精度(4バイト): 符号[1bit] + 指数部[8bit] + 仮数部[23bit] 倍精度(8バイト): 符号[1bit] + 指数部[11bit] + 仮数部[52bit] という構造になっている. + 浮動小数点数 Making NaN NaNを定数として定義する方法はいくつかあって,コンパイラによって通ったり通らなかったりらしいが,次の方法が良いようである. + FortranでNaNを定数として宣言する何通りかの方法 - Qiita 0/0, log(-1)なども候補として挙げられていたが,この記事にもあるようにgfortranでは0/0は通らないし,ifortでもコンパイルオプションにはじかれたりもするのでお勧めしない. Execute. Judging NaN NaNの判定ではtransferによる逆変換は使わない方が良い. 上のサンプルを見ると, transfer(nan,0_8) == -1_8 となりそうに思われるが,nanをモジュールから定数として呼び出すときにはこれが成り立たない.モジュールで定数として定義されたnanをプログラムから呼び出すと,仮数部の値が変わっており,transferで整数に変換したとき-1_8に戻らなくなっている,ということが起きる. コンパイラーによっては仮数分もそのまま保存されるが,移植性を考えるとtransferは使わず,素直に指数部と仮数部の中を確認するのが良い. NaN判定関数
    Infinity
    Definition of Infinity 無限大.負の無限大は-Infinityと表される. 指数部が全て1, 仮数部が全て0のビット列.倍精度では 0 11111111111 0000000000000000000000000000000000000000000000000000 -Infinityは 1 11111111111 0000000000000000000000000000000000000000000000000000 Making Infinity real(8), parameter :: inf = set_exponent(1.d0, 1025) で作ろうとするとコンパイラーによってはオーバーフローで弾かれる. 定義に従って作るのが良いようである. 書式指定文字を使って,数値をビット表記や16進数表記などで定義できる. I: 10進数 B: 2進数 O: 8進数 Z: 16進数 例えば0011は2進数では3なので,B'0011'は3である. Execute. これとtransfer関数を使ってNaN, Infinity, -Infinityを定義できる. この方法ではオーバーフローは起きないようである. B'0111111110000...'で定義することも可能だが,長くて見栄えが悪いので16進数で定義するのが良いだろう. Judging infinity こちらもNaNと同様に定義に従ってビット列の指数部と仮数部から判定するのが良い.
    Sample
    NaN, Inf, -Infを定数として定義し,またNaN判定,Inf判定の関数を提供するモジュール. 及びそのモジュールを使って実際に判定を行ったプログラム. Execute. 一応transfer(-1_8,0.d0)で作ったものも確かめた.きちんとNaNとして判定されている.
    References
    FortranでNaNを定数として宣言する何通りかの方法 - Qiita + https://qiita.com/implicit_none/items/a96d5bdb1a0cf05b6f03 Fortranにおける文字型変数の宣言方法と関連機能 - Qiita + https://qiita.com/implicit_none/items/f582f2d4e10f2655e208