Class: Flt::C51BCDFormat

Inherits:
BCDFormat show all
Defined in:
lib/float-formats/formats.rb

Overview

C51 (C compiler for the Intel 8051) BCD Floating point formats

Constant Summary

Constants included from Flt

APPLE, HFP_DOUBLE, HFP_EXTENDED, HFP_SINGLE, IEEE_128, IEEE_128_BE, IEEE_DEC128, IEEE_DEC32, IEEE_DEC64, IEEE_DOUBLE, IEEE_D_BE, IEEE_EXTENDED, IEEE_HALF, IEEE_H_BE, IEEE_QUAD, IEEE_Q_BE, IEEE_SINGLE, IEEE_S_BE, IEEE_X_BE, IEEE_binaryx, MBF_EXTENDEND, RPL, RPL_X

Instance Attribute Summary

Attributes inherited from FormatBase

#exponent, #sign, #significand

Class Method Summary collapse

Methods inherited from BCDFormat

define, pack_fields, total_bits, total_bytes, total_nibbles, unpack_fields

Methods inherited from DecimalFormatBase

decimal_digits_necessary, decimal_digits_stored, decimal_max_exp, decimal_min_exp, define, radix, radix_log, radix_log10, radix_power

Methods inherited from FormatBase

#<=>, arithmetic, arithmetic_type, bias, canonicalized, context, #convert_to, decimal_digits_necessary, decimal_digits_stored, decimal_max_exp, decimal_min_exp, define, endianness, epsilon, #form_class, #fp_format, from, from_bits, from_bits_text, from_bytes, from_hex, from_number, from_text, gradual_underflow?, half_epsilon, #infinite?, infinity, #initialize, join, max_value, maximum_integral_significand, min_normalized_value, min_value, minimum_normalized_integral_significand, #minus, nan, #nan?, #next_minus, #next_plus, #normal?, normalized?, num, num_class, numerals_conversion, pack_fields_hash, radix_log, radix_log10, radix_max_exp, radix_min_exp, radix_power, rounding_mode, sign_from_unit, sign_to_unit, #split, strict_epsilon, #subnormal?, switch_sign_value, #to, #to_a, #to_bits, #to_bits_text, #to_bytes, #to_hex, #to_num, #to_text, #ulp, unpack_fields_hash, zero, #zero?

Methods included from Flt

#*, #+, #-, #-@, #/, bcd2dpd, bitnot, convert_bytes, dbl_from_float, dbl_from_text, dbl_to_float, define, dpd2bcd, dpd_to_hexbcd, float_bin, float_dec, float_from_integral_sign_significand_exponent, float_from_integral_significand_exponent, float_shortest_dec, float_significant_dec, float_to_integral_sign_significand_exponent, float_to_integral_significand_exponent, hex_from_float, hex_to_float, hexbcd_to_dpd, sgl_from_float, sgl_from_text, sgl_to_float

Constructor Details

This class inherits a constructor from Flt::FormatBase

Class Method Details

.bcd_field?(i) ⇒ Boolean

Returns:

  • (Boolean)


610
611
612
# File 'lib/float-formats/formats.rb', line 610

def self.bcd_field?(i)
  @field_meaning[i]==:significand
end

.exponent_digitsObject



581
582
583
# File 'lib/float-formats/formats.rb', line 581

def self.exponent_digits
  @fields[:exponent_sign]*4-1
end

.exponent_radixObject

:nodoc:



578
579
580
# File 'lib/float-formats/formats.rb', line 578

def self.exponent_radix
  2
end

.minus_sign_valueObject



584
585
586
# File 'lib/float-formats/formats.rb', line 584

def self.minus_sign_value
  1
end

.pack(s, m, e) ⇒ Object



614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
# File 'lib/float-formats/formats.rb', line 614

def self.pack(s,m,e)
  s = sign_from_unit(s)
  msb = radix_power(@significand_digits-1)
  es = 0
  if e==:zero
    e = @zero_encoded_exp
    m = 0
  elsif e==:infinity
    e = @infinite_encoded_exp || radix_power(@fields[:exponent])-1
    m = 0
  elsif e==:nan
    e = @infinite_encoded_exp || radix_power(@fields[:exponent])-1
    s = minus_sign_value # ?
    m = radix_power(@significand_digits-2) if m==0
  elsif e==:denormal
    e = @denormal_encoded_exp
  else
    # to do: try to adjust m to keep e in range if out of valid range
    # to do: reduce m and adjust e if m too big

    min_exp = radix_min_exp(:integral_significand)
    if m>0
      while m<msb && e>min_exp
        e -= 1
        m *= radix
      end
    end
    if m<msb && @denormal_encoded_exp
      e = @denormal_encoded_exp
    elsif m==0 # => && @denormal_encoded_exp.nil?
      e = 0
    else
      e = encode_exponent(e, :integral_significand)
    end
  end
  exp_bits = exponent_digits
  e_s = e + (s << exp_bits)
  pack_fields_hash significand: m, exponent_sign: e_s
end

.unpack(v) ⇒ Object



587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
# File 'lib/float-formats/formats.rb', line 587

def self.unpack(v)
  f = unpack_fields_hash(v)
  m = f[:significand]
  e_s = f[:exponent_sign]
  exp_bits = exponent_digits
  e = e_s & (2**exp_bits-1)
  s = e_s >> exp_bits
  if m==0
    # +-zero
    e = :zero
  elsif @infinite_encoded_exp && e==@infinite_encoded_exp && m==0
    # +-inifinity
    e = :infinity
  elsif @nan_encoded_exp && e==@nan_encoded_exp && m!=0
    # NaN
    e = :nan
  else
    # normalized number
    e = decode_exponent(e, :integral_significand)
  end
  s = sign_to_unit(s)
  [s,m,e]
end