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