Method: Flt::DPDFormat.define

Defined in:
lib/float-formats/classes.rb

.define(params) ⇒ Object

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

  • :sign

  • :combination

  • :exponent_continuation

  • :significand_continuation



1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
# 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