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, 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, 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, nio_read_neutral, #nio_write_neutral, #normal?, num, num_class, 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)


563
564
565
# File 'lib/float-formats/formats.rb', line 563

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

.exponent_digitsObject



534
535
536
# File 'lib/float-formats/formats.rb', line 534

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

.exponent_radixObject

:nodoc:



531
532
533
# File 'lib/float-formats/formats.rb', line 531

def self.exponent_radix
  2
end

.minus_sign_valueObject



537
538
539
# File 'lib/float-formats/formats.rb', line 537

def self.minus_sign_value
  1
end

.pack(s, m, e) ⇒ Object



567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
# File 'lib/float-formats/formats.rb', line 567

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



540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
# File 'lib/float-formats/formats.rb', line 540

def self.unpack(v)
  f = to_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