0
半精度の浮動小数点型の場合はbinary16 encodingを実装しようとしています。BinDataで基本データ型を実装する
コードは3つのプロパティ(符号、指数、小数点)を持つオブジェクトを返しますが、floatを返すようにしたいと思います。今は、to_f
に電話してフロートに着く必要があります。統合されたintクラスとfloatクラスが動作するようにこれを動作させたいと思います。ここで
は私のコードです:
require 'bindata'
class Binary16Be < BinData::Record
# naming based on https://en.wikipedia.org/wiki/Half-precision_floating-point_format
bit1 :sign_bit
bit5 :exponent
bit10 :fraction
def sign
sign_bit.zero? ? 1 : -1
end
def to_f
if exponent == 31 # special value in binary16 - all exponent bits are 1
return fraction.zero? ? (sign * Float::INFINITY) : Float::NAN
end
sign * 2**(exponent - 15) * (1.0 + fraction.to_f/1024)
end
end
私が望むもの:
Binary16Be.read("\x3C\x00")
=> 1.0
今何が起こる:
Binary16Be.read("\x3C\x00")
{:sign_bit=>0, :exponent=>15, :fraction=>0}