c - 没有 float 的有效计算方法,C

标签 c integer integer-math

我需要做一个数学运算,将从传感器接收到的 16 位值转换为实际的相对湿度值。计算公式如下:

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

鉴于此在 float 学中将是:

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

但我想避免 float 学运算,因为我的平台是“无 FPU”的。

在这里用整数数学计算和存储 RH 的最有效方法是什么?考虑到它的湿度,实际值应该在 0 到 100% 之间,但有时近似值可能会导致 rh 可能略小于 0 或略高于 100(如果我离开那个 float ,我可以做类似 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 合作.但可能还有更有效的方法?

最佳答案

你可以把右边写成这样来避免大的中间项

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

变成了

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

您可以删除最后一项,也可能删除倒数第二项,具体取决于您希望基点截断的精确度。

关于c - 没有 float 的有效计算方法,C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50269691/

相关文章:

c - 存在内存泄漏的链表

python - 将整数转换为字符串过程 ("under the hood")

c - C 中的负数除法

mysql - 为什么我不能将我的 INT 从无符号更改为有符号?可以签名 Zerofill 吗?

带有故意溢出的python 32位和64位整数数学

c - 仅使用基本数学函数对 C 中的整数进行排序

C数组压入,为什么减去 '0'?

c - - int *p() - 在c中意味着什么?

将 float 与零进行比较