Files
max668_calc/lib/eseries.c

126 lines
3.0 KiB
C

/*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;
}