问题描述
我有一个浮点数 242.1356783 和 -87.10234512, 我需要将其限制为 242.1 我在 cortex m4 微控制器上尝试了以下
1.data[i] = (int)(data[i] *10);
数据[i] = 数据[i]/10;
2.data[i]=ceilf(data[i] * 100)/100;
3.data[i] = roundf(data[i]*100)/100; 但没有工作。
有人有其他解决方案吗?
解决方法
浮点 (FP) 数通常使用二进制表示法进行编码:一些 whole number * power of 2。
242.1 和 -87.1 则不能完全编码为 FP 数字。而是使用附近的一个。
我需要将其限制为 242.1
OP 可以使用以下内容:(使用 round()
代替 roundf()
以避免溢出)。
data[i] = (float) (round(data[i]*10.0)/10);
更复杂,但不调用 double
数学,但可以处理大多数情况*:
// If there is a fraction ...
if (fmodf(data[i],1.0f) && isfinite(data[i])) {
data[i] = roundf(data[i]*10.0f)/10;
}
最佳解决方案涉及更改更高级别的目标。也许将值缩放 10。示例:内部使用 2421.0 分度而不是 242.1 度。
或等待语言更新:C 2x 可能支持十进制 FP。
OP 提出的想法的弱点:
-
data[i] = (int)(data[i] *10); data[i] = data[i]/10;
:在大约 50% 的时间内没有朝正确的方向取整。当data[i] *10
超出int
范围时失败。 -
data[i]= ceilf(data[i] * 100)/100;
:在大约 50% 的时间内没有朝正确的方向取整。data[i] *10
可能会溢出。我怀疑 OP 在这里想要 10 个。 -
data[i] = roundf(data[i]*100)/100;
data[i] *100
可能会溢出。我怀疑 OP 在这里想要 10 个。
* 当 data[i]*10.0f
和乘积不精确且接近 xxx.x5 时,可能会错误地舍入