92 lines
2.4 KiB
C
92 lines
2.4 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;
|
|
}
|
|
|
|
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/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;
|
|
}
|