class Flt::DPDFormat

DPD (Densely-Packed-Decimal) formats

Public Class Methods

define(params) click to toggle source

The field that need to be defined (with lenghts given in decimal digits) are

  • :sign

  • :combination

  • :exponent_continuation

  • :significand_continuation

Calls superclass method Flt::FormatBase::define
# File lib/float-formats/classes.rb, line 1295
def self.define(params)

  @splitted_fields_supported = false
  define_fields params[:fields]
  @internal_field_lengths = @field_lengths
  @internal_field_meaning = @field_meaning
  @internal_fields = @fields
  raise "Unsupported DPD format" unless @internal_fields[:combination]==5 && @internal_fields[:sign]==1 && [0,4,7].include?(@internal_fields[:significand_continuation]%10)


  @exponent_bits = 2 + @internal_fields[:exponent_continuation]

  extra_bits = (@internal_fields[:significand_continuation] % 10)
  extra_digits = (extra_bits==0) ? 0 : ((extra_bits==4) ? 1 : 2)
  @significand_digits = 1 + 3*(@internal_fields[:significand_continuation]/10) + extra_digits

  define_fields [:type,1,:sign,1,:exponent,@exponent_bits,:significand,@significand_digits]

  if params[:bias].nil?

    params[:bias_mode] = :scientific_significand

    @exp_limit = 3*(2**@internal_fields[:exponent_continuation])-1

    params[:max_exp] = @exp_limit/2
    params[:min_exp] = -params[:max_exp]
    params[:max_exp] += 1 if (@exp_limit%2)==1
    params[:bias]= -params[:min_exp]

  end

  super  params

end