Class: Numerals::Format::BaseScaler

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
ModalSupport::BracketConstructor
Defined in:
lib/numerals/format/base_scaler.rb

Overview

This converts the number representation contained in an ExpSetter scaling the base of the significand.

This is typically used when the ExpSetter base is 2 to render the number in C99 '%A' format, i.e., in hexadecimal base. Only the significand is shown in base 16; the exponent is still a power of two, and represented in base 10.

This is a generalization of the %A format where any base which is a power of the original base can be used for the significand.

The number exponent is previously adjusted in the ExpSetter and that doesn't change, only the significand parts are converted from the original base base to the new base base**base_scale.

This will require adjusting the repeating digits position and length, and adding leading 0s (in the original base) to the signficant and/or trailing digits may be required.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(exp_setter, base_scale) ⇒ BaseScaler

Returns a new instance of BaseScaler.



26
27
28
29
30
31
32
# File 'lib/numerals/format/base_scaler.rb', line 26

def initialize(exp_setter, base_scale)
  @setter = exp_setter
  @numeral = @setter.numeral
  @base_scale = base_scale
  @scaled_base = @setter.base**@base_scale
  adjust
end

Instance Attribute Details

#base_scale ⇒ Object (readonly)

Returns the value of attribute base_scale.



36
37
38
# File 'lib/numerals/format/base_scaler.rb', line 36

def base_scale
  @base_scale
end

#numeral ⇒ Object (readonly)

Returns the value of attribute numeral.



36
37
38
# File 'lib/numerals/format/base_scaler.rb', line 36

def numeral
  @numeral
end

#scaled_base ⇒ Object (readonly)

Returns the value of attribute scaled_base.



36
37
38
# File 'lib/numerals/format/base_scaler.rb', line 36

def scaled_base
  @scaled_base
end

Instance Method Details

#base ⇒ Object



43
44
45
# File 'lib/numerals/format/base_scaler.rb', line 43

def base
  scaled_base
end

#fractional_insignificant_size ⇒ Object



56
57
58
59
60
61
62
# File 'lib/numerals/format/base_scaler.rb', line 56

def fractional_insignificant_size
  if @setter.numeral.approximate?
    (@setter.fractional_insignificant_size + @scaling_trailing_size)/@base_scale
  else
    0
  end
end

#fractional_part ⇒ Object



47
48
49
50
# File 'lib/numerals/format/base_scaler.rb', line 47

def fractional_part
  ungrouped = @setter.fractional_part + (0...@scaling_trailing_size).map{|i| repeat_digit(i)}
  grouped_digits ungrouped
end

#fractional_part_size ⇒ Object



52
53
54
# File 'lib/numerals/format/base_scaler.rb', line 52

def fractional_part_size
  (@setter.fractional_part_size + @scaling_trailing_size)/@base_scale
end

#integer_insignificant_size ⇒ Object



73
74
75
76
77
78
79
# File 'lib/numerals/format/base_scaler.rb', line 73

def integer_insignificant_size
  if @setter.numeral.approximate?
    (@setter.integer_insignificant_size + @scaling_leading_size)/@base_scale
  else
    0
  end
end

#integer_part ⇒ Object



64
65
66
67
# File 'lib/numerals/format/base_scaler.rb', line 64

def integer_part
  ungrouped = [0]*@scaling_leading_size + @setter.integer_part
  grouped_digits ungrouped
end

#integer_part_size ⇒ Object



69
70
71
# File 'lib/numerals/format/base_scaler.rb', line 69

def integer_part_size
  (@setter.integer_part_size + @scaling_leading_size)/@base_scale
end

#repeat_insignificant_size ⇒ Object



85
86
87
# File 'lib/numerals/format/base_scaler.rb', line 85

def repeat_insignificant_size
  0
end

#repeat_part ⇒ Object



89
90
91
92
# File 'lib/numerals/format/base_scaler.rb', line 89

def repeat_part
  ungrouped = (@scaling_trailing_size...@scaling_trailing_size+@repeat_length).map{|i| repeat_digit(i)}
  grouped_digits ungrouped
end

#repeat_size_size ⇒ Object



81
82
83
# File 'lib/numerals/format/base_scaler.rb', line 81

def repeat_size_size
  @repeat_length/@base_scale
end