include Math # 2を底にした対数を取り切り捨てる def log2(x) (log(x)/log(2)).floor end # 16ビットの浮動小数点形式への変換 # 大きさ3の配列で # [符号(0: 正, 1: 負), 指数部(0-63), 仮数部(0-1023)] # 指数部が63の時はNaN(Not a Number 表現できる範囲外の数) # 指数部が0の時は0 def toFloat16(f) if f<0 sign=1 f=-f; else sign=0 end if f==0 [0,0,0] else exp=log2(f) if(exp+31<=0) [sign,0,0] elsif(exp+31>=63) [sign,63,0] else f=f/2**exp [sign,exp+31,(f* 2**10).floor-1024] end end end # NaNに対応する定数 NAN=0.0/0.0 # 16ビットの浮動小数点形式からの変換 def fromFloat16(x) if(x[1]==0) (1-2*x[0])*0.0 elsif(x[1]==63) NAN else (1-2*x[0])* 2.0**(x[1]-31) * (x[2]+1024) * 2.0**-10 end end # Float16同士の加算 def add(x,y) toFloat16(fromFloat16(x)+fromFloat16(y)) end # Float16同士の減算 def sub(x,y) toFloat16(fromFloat16(x)-fromFloat16(y)) end # Float16同士の積算 def mul(x,y) toFloat16(fromFloat16(x)*fromFloat16(y)) end # Float16同士の除算 def div(x,y) toFloat16(fromFloat16(x)/fromFloat16(y)) end