2017-04-07 3 views
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} 

答えて

0

(これは実際に私自身の答えではない、私はこれを宝石の作者から受け取った。このQに合うように彼の答えにわずかな変更を加えた&フォーマット少し良く)

手順はあなたのケースではin the bindata Wiki/Primitive Types

に記載されている:。

  1. サブクラスPrimitive代わりのRecord
  2. 名前の変更#to_f#get
  3. から#set
  4. を実装

変換されたコード

class Binary16Be < BinData::Primitive 
    # 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 get 
    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 

    def set(val) 
    self.sign = (val >= 0.0) 
    self.fraction = ... # TODO implement 
    self.exponent = ... # TODO implement 
    end 
end 
関連する問題