Эффективный способ расчета без поплавка, C - PullRequest
0 голосов
/ 10 мая 2018

Мне нужно сделать математику для преобразования 16-битного значения, полученного от датчика, в реальное значение относительной влажности.Он рассчитывается по следующей формуле:

formula rh=-6+125*(Srh/2^16)

Учитывая это в математике с плавающей запятой, которая будет:

uint16_t buf = 0x7C80; // Example
float rh = ((float)buf*125 / 65536)-6;

Но я хочуизбегайте математических вычислений с плавающей точкой, так как моя платформа "FPUless".

Каков наиболее эффективный способ вычисления и сохранения относительной влажности в целочисленной математике?Учитывая, что это влажность, фактическое значение должно быть между 0 и 100%, но иногда приближение может привести к тому, что rh может быть чуть меньше 0 или выше 100 (если я оставлю этот поплавок, я могу просто сделать что-то вроде if (rh<0) rh=0; else if (rh>100) rh=100;), и язаботиться только о последних 2 цифрах после десятичной точки (% .2f).

В настоящее время я решил это следующим образом:

int16_t rhint = ((uint32_t)buf*12500 / 65536)-600;

И работа с rhint / 100; rhint % 100.Но, возможно, есть более эффективный способ?

1 Ответ

0 голосов
/ 10 мая 2018

Вы можете избежать большого промежуточного термина, написав правую часть как

-6 + (128 - 4 + 1) * S / 65536

Что становится

-6 + S / 512 - S / 16384 + S / 65536

Возможно, вам удастся отбросить последний член и, возможно, предпоследний, в зависимости от того, насколько точным вы хотите, чтобы было усечение базовой точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...