У меня есть устройство, которое рассчитывает сопротивления в диапазоне от 10 мкОм до 200 кОм. Я хочу написать кусок кода, чтобы преобразовать эти числа в более простой для чтения формат;например: преобразовать 99912,3125 в 99,91 кОм и 0,010039 в 10,04 мОм. до сих пор я написал этот код, который по большей части работает нормально:
float num[9] = {100000, 10000, 1000, 100, 10, 1, 0.1, 0.01, 0.001};
float nums[9] = {99999.9,9999.9,999.9,99.9,9.9,0.9,0.09,0.009,0.0009};
String prefixes[3] = {"mΩ","Ω","KΩ"};
int powers[3] = {-3,0,3};
void setup() {
Serial.begin(9600);
}
int prefix(int x){
return (x < 0) ? 0 : (x/3)+1;
}
int decimalPlaces(int x){
return (x < 0) ? abs(x) : 3-(int(x)%3);
}
void loop() {
for (int i=0; i<9; i++){
Serial.print(num[i],6);
Serial.print("\t");
if (i>4){
Serial.print("\t");
}
int lg = log10(num[i]);
int pref = prefix(lg);
Serial.print(" | ");
Serial.print(num[i]/pow(10,powers[pref]),decimalPlaces(lg));
Serial.println(prefixes[pref]);
}
Serial.println("##############################");
for (int i=0; i<9; i++){
Serial.print(nums[i],6);
Serial.print("\t");
if (i>3){
Serial.print("\t");
}
int lg = log10(nums[i]);
int pref = prefix(lg);
Serial.print(" | ");
Serial.print(nums[i]/pow(10,powers[pref]),decimalPlaces(lg));
Serial.println(prefixes[pref]);
}
Serial.println("##############################");
Serial.println(int(log10(0.1)));
Serial.println(int(log10(0.9)));
Serial.println(int(log10(1)));
while(true);
}
А вот вывод кода:
но есть проблема с изменением между миллиом ом и диапазоном ом. Как вы можете видеть, log10 (0.9) - это то же самое, что log10 (1), несмотря на тот же порядок величины, что и 0.1! поэтому вместо 0,9 отображается как 900 мОм, оно отображается как 0,900 Ω, что я не собирался делать. Есть ли более простой способ добиться этого типа форматирования? если нет, то как я могу решить проблему с этой маленькой ошибкой?