/*eseries.c*/ #include"eseries.h" ESeriesMaxValue get_E_MAX(ESeries E_series) { ESeriesMaxValue output; switch(E_series) { case E3: output = E3_MAX; break; case E6: output = E6_MAX; break; case E12: output = E12_MAX; break; case E24: output = E24_MAX; break; case E48: output = E48_MAX; break; case E96: output = E96_MAX; break; case E192: output = E192_MAX; break; default: output = E_NIL; break; } return output; } ESeries get_E_Series(int number) { ESeries output; switch (number) { case 3: output = E3; break; case 6: output = E6; break; case 12: output = E12; break; case 24: output = E24; break; case 48: output = E48; break; case 96: output = E96; break; case 192: output = E192; break; default: output = E0; break; } return output; } double round_to_E_series (double continuous_value, ESeries E_series) { /* * check for range. An E series is defined within one decade. * values from 1 to 10 are accepted */ if (continuous_value >= 10 || continuous_value < 1) { printf("eseries:round_to_E_series: Value out of range.\n"); return E_NIL; } double e_value = 0.0; // set the max array index for given e series. unsigned int e_max_values = get_E_MAX(E_series); if (e_max_values == E_NIL) { printf("eseries:round_to_E_series: Unknown E series.\n"); return E_NIL; } int upper_e_limit = e_max_values; int lower_e_limit = 0; for (int i = 0 ; i < log2((e_max_values + 1 / 3)); i++) { if (continuous_value < E_values[E_series][(((upper_e_limit - lower_e_limit) + 1) / 2) + lower_e_limit]) { upper_e_limit = (((upper_e_limit - lower_e_limit) + 1) / 2) + lower_e_limit - 1; } else { lower_e_limit = (((upper_e_limit - lower_e_limit) + 1) / 2) + lower_e_limit; } } if (continuous_value < E_values[E_series][lower_e_limit + 1]) { if (fabs(continuous_value - E_values[E_series][lower_e_limit]) < fabs(continuous_value - E_values[E_series][lower_e_limit + 1])) { e_value = E_values[E_series][lower_e_limit]; } else { e_value = E_values[E_series][lower_e_limit + 1]; } } else { if (fabs(continuous_value - E_values[E_series][upper_e_limit]) < fabs(continuous_value - E_values[E_series][upper_e_limit - 1])) { e_value = E_values[E_series][upper_e_limit]; } else { e_value = E_values[E_series][upper_e_limit - 1]; } } return e_value; }