fortran66のブログ

fortran について書きます。

【メモ帳】コンピュータ上の畜生な数

NaN など

標準的な実数の公理系では 0 / 0 とかは未定義だが、IEEE754 で NaN を数直線上の順序集合とは独立した元として付け加えて、一種の non standard analysis 的な拡大した系に演算規則を導入しているので、NaN が絡むと排中律も成り立たないし x==x が偽で x/=x が真となったりしている。

ついでに無限小も加えればいい気もする。

整数の方は符号なしで考えれば mod 232,64 の剰余演算で理解できるが、2の補数表現で負の数を考えると 0 以外にも -x == x となるような数が出てしまう。

use, intrinsic :: iso_fortran_env

int: block
  integer(int8) :: n
  n = -128
  if (n < 0) n = -n
  print *, n
end block int

real: block
  real(real32) :: x
  x = 0.0
  x = x / x
  print *, x
  print *, x==x, x /= x
  print *, x < 0.0, x==0.0, x > 0.0
end block real

end
$main
 -128
              NaN
 F T
 F F F