Class: Cosmos::PolynomialConversion

Inherits:
Conversion
  • Object
show all
Defined in:
lib/cosmos/conversions/polynomial_conversion.rb,
ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c

Overview

Performs a polynomial conversion on the value

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(coeff_array) ⇒ PolynomialConversion

Initializes the conversion with the given polynomial coefficients. Sets the converted_type to :FLOAT and the converted_bit_size to 64.

Parameters:

  • coeff_array (Array<Float>)

    The polynomial coefficients



26
27
28
29
30
31
32
33
34
# File 'lib/cosmos/conversions/polynomial_conversion.rb', line 26

def initialize(coeff_array)
  super()
  @coeffs = []
  coeff_array.each do |coeff|
    @coeffs << coeff.to_f
  end
  @converted_type = :FLOAT
  @converted_bit_size = 64
end

Instance Attribute Details

#coeffsArray<Float>

Returns The polynomial coefficients.

Returns:

  • (Array<Float>)

    The polynomial coefficients



20
21
22
# File 'lib/cosmos/conversions/polynomial_conversion.rb', line 20

def coeffs
  @coeffs
end

Instance Method Details

#call(value, myself, buffer) ⇒ Object

Calling this method performs a polynomial conversion on the given value.

conversion.call(1, packet) #=> 2.5


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c', line 31

static VALUE polynomial_conversion_call(VALUE self, VALUE value, VALUE myself, VALUE buffer)
{
  volatile VALUE coeffs = Qnil;
  long coeffs_length = 0;
  int index = 0;
  double double_value = 0.0;
  double coeff = 0.0;
  double converted = 0.0;
  double raised_to_power = 1.0;

  coeffs = rb_ivar_get(self, id_ivar_coeffs);
  coeffs_length = RARRAY_LEN(coeffs);
  double_value = RFLOAT_VALUE(rb_funcall(value, id_method_to_f, 0));

  /* Handle C0 */
  coeff = RFLOAT_VALUE(rb_ary_entry(coeffs, 0));
  converted += coeff;

  /* Handle Coefficients raised to a power */
  for (index = 1; index < coeffs_length; index++)
  {
    raised_to_power *= double_value;
    coeff = RFLOAT_VALUE(rb_ary_entry(coeffs, index));
    converted += (coeff * raised_to_power);
  }

  return rb_float_new(converted);
}

#to_sString

Returns Class followed by the list of coefficients.

Returns:

  • (String)

    Class followed by the list of coefficients



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/cosmos/conversions/polynomial_conversion.rb', line 41

def to_s
  result = ""
  @coeffs.length.times do |index|
    if index == 0
      result << "#{@coeffs[index]}"
    elsif index == 1
      result << " + #{@coeffs[index]}x"
    else
      result << " + #{@coeffs[index]}x^#{index}"
    end
  end
  result
end